diff --git a/lib/embed_workflow/base.rb b/lib/embed_workflow/base.rb index 0e4a6ec..e18d2ba 100644 --- a/lib/embed_workflow/base.rb +++ b/lib/embed_workflow/base.rb @@ -2,10 +2,18 @@ module EmbedWorkflow module Base + UNSET = Object.new.freeze + attr_accessor :skey class << self attr_accessor :skey end + + private + + def prepare_params(hash) + hash.reject { |_, v| v == UNSET } + end end end diff --git a/lib/embed_workflow/users.rb b/lib/embed_workflow/users.rb index 56766b1..d81c67c 100644 --- a/lib/embed_workflow/users.rb +++ b/lib/embed_workflow/users.rb @@ -11,14 +11,15 @@ class << self RESOURCE_BASE_PATH = "#{BASE_API_PATH}/users".freeze - def upsert(key:, name: nil, email: nil, data: nil, groups: nil) - attrs = { + def upsert(key:, name: UNSET, email: UNSET, data: UNSET, groups: UNSET, time_zone: UNSET) + attrs = prepare_params({ key: key, name: name, email: email, data: data, - groups: groups - }.compact + groups: groups, + time_zone: time_zone + }) put_request( path: "#{RESOURCE_BASE_PATH}/#{key}", diff --git a/spec/users_spec.rb b/spec/users_spec.rb index a3e4855..bf40f16 100644 --- a/spec/users_spec.rb +++ b/spec/users_spec.rb @@ -91,6 +91,8 @@ key: "api-user-1", name: "Jane Doe", email: "jane@example.com", + time_zone: "America/New_York", + groups: ["admin", "users"], data: data } }) @@ -103,9 +105,61 @@ key: "api-user-1", name: "Jane Doe", email: "jane@example.com", + time_zone: "America/New_York", + groups: ["admin", "users"], data: data ) end end + + context "with nil values to unset fields" do + before do + allow_any_instance_of(EmbedWorkflow::Client) + .to receive(:put_request) + .with({ + path: "/api/v1/users/api-user-1", + body: { + key: "api-user-1", + time_zone: nil, + groups: nil + } + }) + .and_return("response") + end + + it "sends nil values to unset time_zone and groups" do + EmbedWorkflow::Users.upsert( + key: "api-user-1", + time_zone: nil, + groups: nil + ) + end + end + + context "with mixed nil and provided values" do + before do + allow_any_instance_of(EmbedWorkflow::Client) + .to receive(:put_request) + .with({ + path: "/api/v1/users/api-user-1", + body: { + key: "api-user-1", + name: "Jane Doe", + email: "jane@example.com", + groups: nil + } + }) + .and_return("response") + end + + it "sends both set and unset values correctly" do + EmbedWorkflow::Users.upsert( + key: "api-user-1", + name: "Jane Doe", + email: "jane@example.com", + groups: nil + ) + end + end end end