@@ -50,4 +50,148 @@ describe('McpServerFactory (integration)', () => {
5050 sinon . match . func ,
5151 ) ;
5252 } ) ;
53+
54+ describe ( 'parameter unwrapping' , ( ) => {
55+ it ( 'unwraps double-wrapped object parameters' , async ( ) => {
56+ const receivedParams : Record < string , unknown > = { } ;
57+
58+ // Simulate the unwrapping logic directly
59+ const parameters = {
60+ currency : {
61+ currency : {
62+ currencyCode : 'CAD' ,
63+ currencyName : 'Canadian Dollar' ,
64+ symbol : 'C$' ,
65+ country : 'Canada' ,
66+ } ,
67+ } ,
68+ } ;
69+
70+ // Apply the same unwrapping logic from the factory
71+ for ( const [ key , value ] of Object . entries ( parameters ) ) {
72+ if ( value && typeof value === 'object' ) {
73+ const valueObj = value as Record < string , unknown > ;
74+ if ( key in valueObj && Object . keys ( valueObj ) . length === 1 ) {
75+ receivedParams [ key ] = valueObj [ key ] ;
76+ } else {
77+ receivedParams [ key ] = value ;
78+ }
79+ } else {
80+ receivedParams [ key ] = value ;
81+ }
82+ }
83+
84+ expect ( receivedParams ) . to . deepEqual ( {
85+ currency : {
86+ currencyCode : 'CAD' ,
87+ currencyName : 'Canadian Dollar' ,
88+ symbol : 'C$' ,
89+ country : 'Canada' ,
90+ } ,
91+ } ) ;
92+ } ) ;
93+
94+ it ( 'keeps normal object parameters unchanged' , ( ) => {
95+ const receivedParams : Record < string , unknown > = { } ;
96+
97+ const normalParams = {
98+ currency : {
99+ currencyCode : 'USD' ,
100+ currencyName : 'US Dollar' ,
101+ symbol : '$' ,
102+ country : 'USA' ,
103+ } ,
104+ amount : 100 ,
105+ } ;
106+
107+ for ( const [ key , value ] of Object . entries ( normalParams ) ) {
108+ if ( value && typeof value === 'object' ) {
109+ const valueObj = value as Record < string , unknown > ;
110+ if ( key in valueObj && Object . keys ( valueObj ) . length === 1 ) {
111+ receivedParams [ key ] = valueObj [ key ] ;
112+ } else {
113+ receivedParams [ key ] = value ;
114+ }
115+ } else {
116+ receivedParams [ key ] = value ;
117+ }
118+ }
119+
120+ expect ( receivedParams ) . to . deepEqual ( normalParams ) ;
121+ } ) ;
122+
123+ it ( 'preserves primitive parameters unchanged' , ( ) => {
124+ const receivedParams : Record < string , unknown > = { } ;
125+
126+ const primitiveParams = {
127+ name : 'John Doe' ,
128+ age : 30 ,
129+ active : true ,
130+ } ;
131+
132+ for ( const [ key , value ] of Object . entries ( primitiveParams ) ) {
133+ if ( value && typeof value === 'object' ) {
134+ const valueObj = value as Record < string , unknown > ;
135+ if ( key in valueObj && Object . keys ( valueObj ) . length === 1 ) {
136+ receivedParams [ key ] = valueObj [ key ] ;
137+ } else {
138+ receivedParams [ key ] = value ;
139+ }
140+ } else {
141+ receivedParams [ key ] = value ;
142+ }
143+ }
144+
145+ expect ( receivedParams ) . to . deepEqual ( primitiveParams ) ;
146+ } ) ;
147+
148+ it ( 'handles array parameters correctly' , ( ) => {
149+ const receivedParams : Record < string , unknown > = { } ;
150+
151+ const arrayParams : Record < string , unknown > = {
152+ items : [ 'item1' , 'item2' , 'item3' ] ,
153+ numbers : [ 1 , 2 , 3 ] ,
154+ } ;
155+
156+ for ( const [ key , value ] of Object . entries ( arrayParams ) ) {
157+ if ( value && typeof value === 'object' ) {
158+ const valueObj = value as Record < string , unknown > ;
159+ if ( key in valueObj && Object . keys ( valueObj ) . length === 1 ) {
160+ receivedParams [ key ] = valueObj [ key ] ;
161+ } else {
162+ receivedParams [ key ] = value ;
163+ }
164+ } else {
165+ receivedParams [ key ] = value ;
166+ }
167+ }
168+
169+ expect ( receivedParams ) . to . deepEqual ( arrayParams ) ;
170+ } ) ;
171+
172+ it ( 'handles null and undefined parameters' , ( ) => {
173+ const receivedParams : Record < string , unknown > = { } ;
174+
175+ const nullParams = {
176+ name : 'John Doe' ,
177+ age : null ,
178+ address : undefined ,
179+ } ;
180+
181+ for ( const [ key , value ] of Object . entries ( nullParams ) ) {
182+ if ( value && typeof value === 'object' ) {
183+ const valueObj = value as Record < string , unknown > ;
184+ if ( key in valueObj && Object . keys ( valueObj ) . length === 1 ) {
185+ receivedParams [ key ] = valueObj [ key ] ;
186+ } else {
187+ receivedParams [ key ] = value ;
188+ }
189+ } else {
190+ receivedParams [ key ] = value ;
191+ }
192+ }
193+
194+ expect ( receivedParams ) . to . deepEqual ( nullParams ) ;
195+ } ) ;
196+ } ) ;
53197} ) ;
0 commit comments