Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions lib/microsoft_kiota_abstractions.rb
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@
require_relative "microsoft_kiota_abstractions/serialization/serialization_writer"
require_relative "microsoft_kiota_abstractions/serialization/serialization_writer_factory"
require_relative "microsoft_kiota_abstractions/serialization/serialization_writer_factory_registry"
require_relative "microsoft_kiota_abstractions/serialization/composed_type_wrapper"
require_relative "microsoft_kiota_abstractions/serialization/parse_node_helper"

module MicrosoftKiotaAbstractions
end
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
module MicrosoftKiotaAbstractions
module ComposedTypeWrapper
end
end
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
module MicrosoftKiotaAbstractions
class ParseNodeHelper
def self.merge_deserializers_for_intersection_wrapper(*targets)
result = {}
targets.each do |target|
result.merge!(target.get_field_deserializers) unless target.nil?
end
result
end
end
end
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,10 @@ def write_additional_data(type)
def write_any_value(key, value)
raise NotImplementedError.new
end


def write_object_value(key, value, *additional_values_to_merge)
raise NotImplementedError.new
end

end
end
81 changes: 81 additions & 0 deletions spec/parse_node_helper_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
# frozen_string_literal: true

require 'microsoft_kiota_abstractions'

RSpec.describe MicrosoftKiotaAbstractions::ComposedTypeWrapper do
it 'can be included in a class as a marker module' do
klass = Class.new { include MicrosoftKiotaAbstractions::ComposedTypeWrapper }
instance = klass.new
expect(instance).to be_a(MicrosoftKiotaAbstractions::ComposedTypeWrapper)
end

it 'is not present on classes that do not include it' do
klass = Class.new
instance = klass.new
expect(instance).not_to be_a(MicrosoftKiotaAbstractions::ComposedTypeWrapper)
end
end

RSpec.describe MicrosoftKiotaAbstractions::SerializationWriter do
let(:writer_class) { Class.new { include MicrosoftKiotaAbstractions::SerializationWriter } }

it 'raises NotImplementedError for write_object_value' do
writer = writer_class.new
expect { writer.write_object_value('key', Object.new) }.to raise_error(NotImplementedError)
end

it 'accepts variadic additional_values_to_merge in its signature' do
writer = writer_class.new
expect { writer.write_object_value('key', Object.new, Object.new, Object.new) }.to raise_error(NotImplementedError)
end
end

RSpec.describe MicrosoftKiotaAbstractions::ParseNodeHelper do
describe '.merge_deserializers_for_intersection_wrapper' do
it 'returns an empty hash when no targets are provided' do
result = described_class.merge_deserializers_for_intersection_wrapper
expect(result).to eq({})
end

it 'skips nil targets' do
result = described_class.merge_deserializers_for_intersection_wrapper(nil, nil)
expect(result).to eq({})
end

it 'merges deserializers from a single target' do
target = double('Parsable')
allow(target).to receive(:get_field_deserializers).and_return({ 'name' => :name_handler, 'age' => :age_handler })

result = described_class.merge_deserializers_for_intersection_wrapper(target)
expect(result).to eq({ 'name' => :name_handler, 'age' => :age_handler })
end

it 'merges deserializers from multiple targets' do
target1 = double('Parsable1')
target2 = double('Parsable2')
allow(target1).to receive(:get_field_deserializers).and_return({ 'name' => :name_handler })
allow(target2).to receive(:get_field_deserializers).and_return({ 'email' => :email_handler })

result = described_class.merge_deserializers_for_intersection_wrapper(target1, target2)
expect(result).to eq({ 'name' => :name_handler, 'email' => :email_handler })
end

it 'later targets override earlier targets on key conflict' do
target1 = double('Parsable1')
target2 = double('Parsable2')
allow(target1).to receive(:get_field_deserializers).and_return({ 'name' => :handler_v1 })
allow(target2).to receive(:get_field_deserializers).and_return({ 'name' => :handler_v2 })

result = described_class.merge_deserializers_for_intersection_wrapper(target1, target2)
expect(result).to eq({ 'name' => :handler_v2 })
end

it 'skips nil targets mixed with valid targets' do
target = double('Parsable')
allow(target).to receive(:get_field_deserializers).and_return({ 'id' => :id_handler })

result = described_class.merge_deserializers_for_intersection_wrapper(nil, target, nil)
expect(result).to eq({ 'id' => :id_handler })
end
end
end