From 1fde9801e73207e9ea9c7b342db320af24ab33d2 Mon Sep 17 00:00:00 2001 From: Tim Engelhardt Date: Thu, 11 Jun 2026 18:26:19 +0200 Subject: [PATCH 1/4] 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/4] 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 } From 8d1ce97180c344a19d23324fb0c6d7603a458cec Mon Sep 17 00:00:00 2001 From: Tim Engelhardt Date: Mon, 15 Jun 2026 15:48:24 +0200 Subject: [PATCH 3/4] Split model class --- lib/ioki/apis/operator_api.rb | 9 ++++---- .../operator/eligibility_group_membership.rb | 10 +-------- ...ership_manually_assign_by_email_address.rb | 21 +++++++++++++++++++ ...p_manually_assign_by_email_address_spec.rb | 7 +++++++ .../eligibility_group_membership_spec.rb | 2 -- spec/ioki/operator_api_spec.rb | 2 +- 6 files changed, 35 insertions(+), 16 deletions(-) create mode 100644 lib/ioki/model/operator/eligibility_group_membership_manually_assign_by_email_address.rb create mode 100644 spec/ioki/model/operator/eligibility_group_membership_manually_assign_by_email_address_spec.rb diff --git a/lib/ioki/apis/operator_api.rb b/lib/ioki/apis/operator_api.rb index e31027a0..12095596 100644 --- a/lib/ioki/apis/operator_api.rb +++ b/lib/ioki/apis/operator_api.rb @@ -319,10 +319,11 @@ class OperatorApi ), 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' + base_path: [API_BASE_PATH, 'providers', :id, 'eligibility_group_memberships'], + path: 'manually_assign_by_email_address', + model_class: Ioki::Model::Operator::EligibilityGroupMembership, + outgoing_model_class: Ioki::Model::Operator::EligibilityGroupMembershipManuallyAssignByEmailAddress, + method_name: 'eligibility_group_memberships_manually_assign_by_email_address' ), Endpoints::ShowSingular.new( :users_recently_used_stations, diff --git a/lib/ioki/model/operator/eligibility_group_membership.rb b/lib/ioki/model/operator/eligibility_group_membership.rb index a1d48b1b..21c69162 100644 --- a/lib/ioki/model/operator/eligibility_group_membership.rb +++ b/lib/ioki/model/operator/eligibility_group_membership.rb @@ -4,14 +4,6 @@ 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 @@ -33,7 +25,7 @@ class EligibilityGroupMembership < Base type: :string attribute :eligibility_group_slug, - on: [:read, :create], + on: :read, type: :string attribute :state, diff --git a/lib/ioki/model/operator/eligibility_group_membership_manually_assign_by_email_address.rb b/lib/ioki/model/operator/eligibility_group_membership_manually_assign_by_email_address.rb new file mode 100644 index 00000000..ea3ba893 --- /dev/null +++ b/lib/ioki/model/operator/eligibility_group_membership_manually_assign_by_email_address.rb @@ -0,0 +1,21 @@ +# frozen_string_literal: true + +module Ioki + module Model + module Operator + class EligibilityGroupMembershipManuallyAssignByEmailAddress < Base + attribute :email_address, + on: :create, + type: :string + + attribute :user_segment_slug, + on: :create, + type: :string + + attribute :eligibility_group_slug, + on: :create, + type: :string + end + end + end +end diff --git a/spec/ioki/model/operator/eligibility_group_membership_manually_assign_by_email_address_spec.rb b/spec/ioki/model/operator/eligibility_group_membership_manually_assign_by_email_address_spec.rb new file mode 100644 index 00000000..18e4b58e --- /dev/null +++ b/spec/ioki/model/operator/eligibility_group_membership_manually_assign_by_email_address_spec.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +RSpec.describe Ioki::Model::Operator::EligibilityGroupMembershipManuallyAssignByEmailAddress 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) } +end diff --git a/spec/ioki/model/operator/eligibility_group_membership_spec.rb b/spec/ioki/model/operator/eligibility_group_membership_spec.rb index f31fef3d..bc86f002 100644 --- a/spec/ioki/model/operator/eligibility_group_membership_spec.rb +++ b/spec/ioki/model/operator/eligibility_group_membership_spec.rb @@ -1,8 +1,6 @@ # 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) } diff --git a/spec/ioki/operator_api_spec.rb b/spec/ioki/operator_api_spec.rb index 186580b2..71b6b8c9 100644 --- a/spec/ioki/operator_api_spec.rb +++ b/spec/ioki/operator_api_spec.rb @@ -1443,7 +1443,7 @@ describe '#eligibility_group_memberships_manually_assign_by_email_address(provider_id, membership)' do let(:membership) do - Ioki::Model::Operator::EligibilityGroupMembership.new( + Ioki::Model::Operator::EligibilityGroupMembershipManuallyAssignByEmailAddress.new( { email_address: 'horst.schlemmer@example.com', user_segment_slug: 'vhh_default', From f09410604e8bae051bf6c6a95d6c21fae605b542 Mon Sep 17 00:00:00 2001 From: Tim Engelhardt Date: Mon, 15 Jun 2026 16:09:36 +0200 Subject: [PATCH 4/4] Use more generic examples --- spec/ioki/operator_api_spec.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/spec/ioki/operator_api_spec.rb b/spec/ioki/operator_api_spec.rb index 71b6b8c9..e7717168 100644 --- a/spec/ioki/operator_api_spec.rb +++ b/spec/ioki/operator_api_spec.rb @@ -1445,9 +1445,9 @@ let(:membership) do Ioki::Model::Operator::EligibilityGroupMembershipManuallyAssignByEmailAddress.new( { - email_address: 'horst.schlemmer@example.com', - user_segment_slug: 'vhh_default', - eligibility_group_slug: 'users_with_driver_assistance' + email_address: 'user@example.com', + user_segment_slug: 'example_user_segment', + eligibility_group_slug: 'example_eligibility_group' } ) end