diff --git a/src/lib/y2firewall/widgets/allowed_services.rb b/src/lib/y2firewall/widgets/allowed_services.rb index bcf569d8..b799c54c 100644 --- a/src/lib/y2firewall/widgets/allowed_services.rb +++ b/src/lib/y2firewall/widgets/allowed_services.rb @@ -92,6 +92,15 @@ def help ) end + def validate + return true if selected_services.empty? + # TRANSLATORS: popup question + msg = _("The selection of services will be lost if you leave without\n" \ + "applying the changes.\n\nDo you really want to continue?\n") + + Yast::Popup.YesNo(msg) + end + private # @!attribute [r] known_services_table @@ -128,6 +137,10 @@ def refresh_services allowed_services_table.services = zone.services.clone end + def selected_services + known_services_table.selected_services + allowed_services_table.selected_services + end + # Return a list of buttons to add/remove elements # # @return [Array] Buttons set UI terms diff --git a/test/lib/y2firewall/widgets/allowed_services_test.rb b/test/lib/y2firewall/widgets/allowed_services_test.rb old mode 100644 new mode 100755 index 6f3361e8..89ebdcc4 --- a/test/lib/y2firewall/widgets/allowed_services_test.rb +++ b/test/lib/y2firewall/widgets/allowed_services_test.rb @@ -60,6 +60,32 @@ .with(widget_id: "allowed:#{zone.name}").and_return(allowed_svcs_table) end + describe "#validate" do + context "when no service has been selected" do + before do + allow(available_svcs_table).to receive(:selected_services).and_return([]) + allow(allowed_svcs_table).to receive(:selected_services).and_return([]) + end + + it "returns true" do + expect(widget.validate).to eq(true) + end + end + + context "when some service has been selected" do + it "warns the user about unsaved changed and ask for continuing" do + expect(Yast::Popup).to receive("YesNo").with(/Do you really want to continue/) + widget.validate + end + + it "returns whether the user wanted to continue or not" do + expect(Yast::Popup).to receive("YesNo").and_return(false, true) + expect(widget.validate).to eq(false) + expect(widget.validate).to eq(true) + end + end + end + describe "#handle" do context "when it receives an event to add a service" do let(:event) { { "ID" => :add } }