Skip to content

Commit

Permalink
Improvements to modify_zone_interfaces widget
Browse files Browse the repository at this point in the history
  • Loading branch information
teclator committed Oct 9, 2018
1 parent 593a1e2 commit 577a5cc
Show file tree
Hide file tree
Showing 2 changed files with 113 additions and 7 deletions.
19 changes: 12 additions & 7 deletions src/lib/y2firewall/widgets/modify_zone_interfaces.rb
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
# find current contact information at www.suse.com.

require "cwm"
require "y2firewall/firewalld"

module Y2Firewall
module Widgets
Expand All @@ -39,7 +40,8 @@ def initialize(interfaces_input)
end

def init
@interfaces_input.value = selected_zone.interfaces.join(", ")
self.value = Y2Firewall::Firewalld.instance.default_zone
interfaces_input.value = selected_zone ? selected_zone.interfaces.join(" ") : ""
end

def opt
Expand All @@ -57,16 +59,15 @@ def items
end

# @macro seeAbstractWidget
def handle(event)
return unless event["ID"] == widget_id
@interfaces_input.value = selected_zone.interfaces.join(" ")
def handle
interfaces_input.value = selected_zone ? selected_zone.interfaces.join(" ") : ""
nil
end

# @macro seeAbstractWidget
def store
return if interfaces_input.value.empty?
selected_zone.interfaces = interfaces_input.value.split
return unless selected_zone
selected_zone.interfaces = interfaces_input.items_from_ui
end

private
Expand All @@ -84,7 +85,7 @@ def zones
#
# @return [Y2Firewall::Firewalld::Zone,nil] selected zone
def selected_zone
return nil if value.empty?
return nil if !value || value.empty?
Y2Firewall::Firewalld.instance.find_zone(value)
end
end
Expand All @@ -101,6 +102,10 @@ def initialize
def label
_("Interfaces:")
end

def items_from_ui
value.split(/ *[, ] */)
end
end
end
end
101 changes: 101 additions & 0 deletions test/lib/y2firewall/widgets/modify_zone_interfaces.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
#!/usr/bin/env rspec
# encoding: utf-8

# Copyright (c) [2018] SUSE LLC
#
# All Rights Reserved.
#
# This program is free software; you can redistribute it and/or modify it
# under the terms of version 2 of the GNU General Public License as published
# by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# more details.
#
# You should have received a copy of the GNU General Public License along
# with this program; if not, contact SUSE LLC.
#
# To contact SUSE LLC about this file by physical or electronic mail, you may
# find current contact information at www.suse.com.

require_relative "../../../test_helper"

require "cwm/rspec"
require "y2firewall/widgets/modify_zone_interfaces"

describe Y2Firewall::Widgets::ZoneInterfacesSelector do
include_examples "CWM::ComboBox"

subject { described_class.new(interfaces_input) }
let(:interfaces_input) { Y2Firewall::Widgets::ZoneInterfaces.new }
let(:firewalld) { Y2Firewall::Firewalld.instance }
let(:public_zone) do
instance_double(
Y2Firewall::Firewalld::Zone, interfaces: ["eth0", "eth1", "wlan0"], name: "public"
)
end

let(:dmz_zone) do
instance_double(Y2Firewall::Firewalld::Zone, interfaces: ["eth2"], name: "dmz")
end

before do
firewalld.default_zone = "public"
end

describe "#handle" do
before do
firewalld.zones = [public_zone, dmz_zone]
end

it "fills the interfaces input field with the selected zone interfaces" do
allow(subject).to receive(:value).and_return("dmz")
expect(interfaces_input).to receive(:value=).with("eth2")
subject.handle
allow(subject).to receive(:value).and_return("public")
expect(interfaces_input).to receive(:value=).with("eth0 eth1 wlan0")
subject.handle
end
end

describe "#store" do
before do
firewalld.zones = [public_zone, dmz_zone]
end

it "modifies the selected zone interfaces with the interfaces input" do
allow(subject).to receive(:value).and_return("dmz")
allow(interfaces_input).to receive(:value).and_return("eth0, eth1")
expect(dmz_zone).to receive(:interfaces=).with(["eth0", "eth1"])

subject.store
end
end
end

describe Y2Firewall::Widgets::ZoneInterfaces do
include_examples "CWM::AbstractWidget"

describe "#items_from_ui" do
let(:expected) { ["eth0", "eth1", "eth2"] }

it "parses comma separated items" do
allow(subject).to receive(:value).and_return("eth0,eth1,eth2")

expect(subject.items_from_ui).to eq(expected)
end

it "parses space separated items" do
allow(subject).to receive(:value).and_return("eth0 eth1 eth2")

expect(subject.items_from_ui).to eq(expected)
end

it "parses clumsily separated items" do
allow(subject).to receive(:value).and_return("eth0 eth1 , eth2")
expect(subject.items_from_ui).to eq(expected)
end
end
end

0 comments on commit 577a5cc

Please sign in to comment.