aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--spec/util_pubsub_spec.lua28
-rw-r--r--util/pubsub.lua11
2 files changed, 35 insertions, 4 deletions
diff --git a/spec/util_pubsub_spec.lua b/spec/util_pubsub_spec.lua
index ec6cecf8..c44832f7 100644
--- a/spec/util_pubsub_spec.lua
+++ b/spec/util_pubsub_spec.lua
@@ -87,6 +87,34 @@ describe("util.pubsub", function ()
end);
end);
+ describe("publish with config", function ()
+ randomize(false); -- These tests are ordered
+
+ local broadcaster = spy.new(function (notif_type, node_name, subscribers, item) -- luacheck: ignore 212
+ end);
+ local service = pubsub.new({
+ broadcaster = broadcaster;
+ autocreate_on_publish = true;
+ });
+
+ it("automatically creates node with requested config", function ()
+ assert(service:publish("node", true, "1", "item 1", { myoption = true }));
+
+ local ok, config = assert(service:get_node_config("node", true));
+ assert.equals(true, config.myoption);
+ end);
+
+ it("fails to publish to a node with differing config", function ()
+ local ok, err = service:publish("node", true, "1", "item 2", { myoption = false });
+ assert.falsy(ok);
+ assert.equals("precondition-not-met", err);
+ end);
+
+ it("allows to publish to a node with differing config when only defaults are suggested", function ()
+ assert(service:publish("node", true, "1", "item 2", { _defaults_only = true, myoption = false }));
+ end);
+ end);
+
describe("#issue1082", function ()
randomize(false); -- These tests are ordered
diff --git a/util/pubsub.lua b/util/pubsub.lua
index cb21174f..45a5aab6 100644
--- a/util/pubsub.lua
+++ b/util/pubsub.lua
@@ -493,7 +493,7 @@ local function check_preconditions(node_config, required_config)
return true;
end
-function service:publish(node, actor, id, item, required_config) --> ok, err
+function service:publish(node, actor, id, item, requested_config) --> ok, err
-- Access checking
local may_publish = false;
@@ -516,13 +516,16 @@ function service:publish(node, actor, id, item, required_config) --> ok, err
if not self.config.autocreate_on_publish then
return false, "item-not-found";
end
- local ok, err = self:create(node, true, required_config);
+ local ok, err = self:create(node, true, requested_config);
if not ok then
return ok, err;
end
node_obj = self.nodes[node];
- elseif required_config and not check_preconditions(node_obj.config, required_config) then
- return false, "precondition-not-met";
+ elseif requested_config and not requested_config._defaults_only then
+ -- Check that node has the requested config before we publish
+ if not check_preconditions(node_obj.config, requested_config) then
+ return false, "precondition-not-met";
+ end
end
if not self.config.itemcheck(item) then
return nil, "invalid-item";