Skip to content

Commit fdff6d9

Browse files
test(core): adding test cases for unwrapping logic from the factory
adding test cases for unwrapping logic from the factory GH-14
1 parent 48a7af9 commit fdff6d9

1 file changed

Lines changed: 144 additions & 0 deletions

File tree

src/__tests__/integration/mcp-tool.integration.ts

Lines changed: 144 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)