From 1fde9801e73207e9ea9c7b342db320af24ab33d2 Mon Sep 17 00:00:00 2001 From: Tim Engelhardt Date: Thu, 11 Jun 2026 18:26:19 +0200 Subject: [PATCH 1/2] Add eligibility group memberships --- .../operator/eligibility_group_membership.rb | 53 +++++++++++++++++++ .../eligibility_group_membership_spec.rb | 15 ++++++ 2 files changed, 68 insertions(+) create mode 100644 lib/ioki/model/operator/eligibility_group_membership.rb create mode 100644 spec/ioki/model/operator/eligibility_group_membership_spec.rb diff --git a/lib/ioki/model/operator/eligibility_group_membership.rb b/lib/ioki/model/operator/eligibility_group_membership.rb new file mode 100644 index 00000000..a1d48b1b --- /dev/null +++ b/lib/ioki/model/operator/eligibility_group_membership.rb @@ -0,0 +1,53 @@ +# frozen_string_literal: true + +module Ioki + module Model + module Operator + class EligibilityGroupMembership < Base + attribute :email_address, + on: :create, + type: :string + + attribute :user_segment_slug, + on: :create, + type: :string + + attribute :id, + on: :read, + type: :string + + attribute :type, + on: :read, + type: :string + + attribute :created_at, + on: :read, + type: :date_time + + attribute :updated_at, + on: :read, + type: :date_time + + attribute :user_id, + on: :read, + type: :string + + attribute :eligibility_group_slug, + on: [:read, :create], + type: :string + + attribute :state, + on: :read, + type: :string + + attribute :active_strategies, + on: :read, + type: :array + + attribute :activated_at, + on: :read, + type: :date_time + end + end + end +end diff --git a/spec/ioki/model/operator/eligibility_group_membership_spec.rb b/spec/ioki/model/operator/eligibility_group_membership_spec.rb new file mode 100644 index 00000000..f31fef3d --- /dev/null +++ b/spec/ioki/model/operator/eligibility_group_membership_spec.rb @@ -0,0 +1,15 @@ +# frozen_string_literal: true + +RSpec.describe Ioki::Model::Operator::EligibilityGroupMembership do + it { is_expected.to define_attribute(:email_address).as(:string) } + it { is_expected.to define_attribute(:user_segment_slug).as(:string) } + it { is_expected.to define_attribute(:eligibility_group_slug).as(:string) } + it { is_expected.to define_attribute(:id).as(:string) } + it { is_expected.to define_attribute(:type).as(:string) } + it { is_expected.to define_attribute(:created_at).as(:date_time) } + it { is_expected.to define_attribute(:updated_at).as(:date_time) } + it { is_expected.to define_attribute(:user_id).as(:string) } + it { is_expected.to define_attribute(:state).as(:string) } + it { is_expected.to define_attribute(:active_strategies).as(:array) } + it { is_expected.to define_attribute(:activated_at).as(:date_time) } +end From 75f1dcd289ced603660ba460ef270caf08a959d9 Mon Sep 17 00:00:00 2001 From: Tim Engelhardt Date: Thu, 11 Jun 2026 18:27:11 +0200 Subject: [PATCH 2/2] Add operator api endpoint to create an eligibility group membership --- lib/ioki/apis/operator_api.rb | 7 +++++++ spec/ioki/operator_api_spec.rb | 27 +++++++++++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/lib/ioki/apis/operator_api.rb b/lib/ioki/apis/operator_api.rb index c8532bf2..e31027a0 100644 --- a/lib/ioki/apis/operator_api.rb +++ b/lib/ioki/apis/operator_api.rb @@ -317,6 +317,13 @@ class OperatorApi model_class: Ioki::Model::Operator::User, except: [:update, :delete] ), + Endpoints::Create.new( + :eligibility_group_membership, + base_path: [API_BASE_PATH, 'providers', :id, 'eligibility_group_memberships'], + path: 'manually_assign_by_email_address', + model_class: Ioki::Model::Operator::EligibilityGroupMembership, + method_name: 'eligibility_group_memberships_manually_assign_by_email_address' + ), Endpoints::ShowSingular.new( :users_recently_used_stations, base_path: nil, diff --git a/spec/ioki/operator_api_spec.rb b/spec/ioki/operator_api_spec.rb index 0a3e0385..186580b2 100644 --- a/spec/ioki/operator_api_spec.rb +++ b/spec/ioki/operator_api_spec.rb @@ -1441,6 +1441,33 @@ end end + describe '#eligibility_group_memberships_manually_assign_by_email_address(provider_id, membership)' do + let(:membership) do + Ioki::Model::Operator::EligibilityGroupMembership.new( + { + email_address: 'horst.schlemmer@example.com', + user_segment_slug: 'vhh_default', + eligibility_group_slug: 'users_with_driver_assistance' + } + ) + end + + it 'calls request on the client with expected params' do + expect(operator_client).to receive(:request) do |params| + expect(params[:url].to_s) + .to eq('operator/providers/0815/eligibility_group_memberships/manually_assign_by_email_address') + expect(params[:method]).to eq(:post) + expect(params[:body]).to eq({ data: membership.serialize(:create, format: :json) }) + [result_with_data, full_response] + end + + expect( + operator_client.eligibility_group_memberships_manually_assign_by_email_address('0815', membership, options) + ) + .to be_a(Ioki::Model::Operator::EligibilityGroupMembership) + end + end + describe '#create_ride_inquiry(product_id)' do let(:ride_inquiry) { Ioki::Model::Operator::RideInquiry.new }