require "pact_broker/config/save" require "pact_broker/configuration" require "pact_broker/config/space_delimited_string_list" module PactBroker module Config describe Save do describe "#call" do let(:setting_names) { [:foo, :bar, :wiffle, :meep, :flop, :peebo, :lalala, :meow, :whitelist, :blah] } let(:configuration) do double("PactBroker::Configuration", foo: true, bar: false, wiffle: ["a", "b", "c"], meep: {a: "thing"}, flop: nil, blah: :boop, peebo: 1, lalala: 1.2, meow: Object.new, whitelist: SpaceDelimitedStringList.parse("foo bar")) end subject { Save.call(configuration, setting_names) } it "saves a Symbol" do subject setting = Setting.find(name: "blah") expect(setting.type).to eq "symbol" expect(setting.value).to eq "boop" end it "saves a false config setting to the database" do subject setting = Setting.find(name: "foo") expect(setting.type).to eq "boolean" expect(setting.value).to eq "1" end it "saves a true config setting to the database" do subject setting = Setting.find(name: "bar") expect(setting.type).to eq "boolean" expect(setting.value).to eq "0" end it "saves an array to the database" do subject setting = Setting.find(name: "wiffle") expect(setting.type).to eq "json" expect(setting.value).to eq '["a","b","c"]' end it "saves a hash to the database" do subject setting = Setting.find(name: "meep") expect(setting.type).to eq "json" expect(setting.value).to eq "{\"a\":\"thing\"}" end it "saves a nil to the database" do subject setting = Setting.find(name: "flop") expect(setting.type).to eq "string" expect(setting.value).to eq nil end it "saves an Integer to the database" do subject setting = Setting.find(name: "peebo") expect(setting.type).to eq "integer" expect(setting.value).to eq "1" end it "saves a Float to the database" do subject setting = Setting.find(name: "lalala") expect(setting.type).to eq "float" expect(setting.value).to eq "1.2" end it "saves a SpaceDelimitedStringList" do subject setting = Setting.find(name: "whitelist") expect(setting.type).to eq "space_delimited_string_list" expect(setting.value).to eq "foo bar" end it "does not save an arbitrary object to the database" do allow(Save.logger).to receive(:warn) expect(Save.logger).to receive(:warn).with("Could not save configuration setting \"meow\" to database as the class Object is not supported.") subject setting = Setting.find(name: "meow") expect(setting).to be nil end end end end end