Skip to content

Commit ae4d13a

Browse files
BigtoCchipshort
authored andcommitted
feat(metadata): add unit and integration tests for DenomMetadata handling null values
1 parent 05f03c4 commit ae4d13a

File tree

1 file changed

+164
-1
lines changed

1 file changed

+164
-1
lines changed

packages/std/src/metadata.rs

Lines changed: 164 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ where
3838
}
3939

4040
#[cfg(test)]
41-
mod tests {
41+
mod unit_tests {
4242
use super::*;
4343
use serde_json::{json, Error};
4444

@@ -152,3 +152,166 @@ mod tests {
152152
assert!(metadata_missing_alias.is_err());
153153
}
154154
}
155+
156+
#[cfg(test)]
157+
mod integration_tests {
158+
use crate::{DenomMetadata, DenomUnit};
159+
use serde_json::{json, Error};
160+
161+
#[test]
162+
fn query_denom_metadata_with_null_denom_units_works() {
163+
// Test case with null denom_units - should deserialize as empty vec
164+
let json_with_null_denom_units = json!({
165+
"description": "Test Token",
166+
"denom_units": null,
167+
"base": "utest",
168+
"display": "TEST",
169+
"name": "Test Token",
170+
"symbol": "TEST",
171+
"uri": "https://test.com",
172+
"uri_hash": "hash"
173+
});
174+
175+
let metadata_with_null_denom_units: DenomMetadata =
176+
serde_json::from_value(json_with_null_denom_units).unwrap();
177+
assert_eq!(
178+
metadata_with_null_denom_units.denom_units,
179+
Vec::<DenomUnit>::default()
180+
);
181+
assert!(metadata_with_null_denom_units.denom_units.is_empty());
182+
183+
// Test normal case with provided denom_units
184+
let json_with_units = json!({
185+
"description": "Test Token",
186+
"denom_units": [
187+
{
188+
"denom": "utest",
189+
"exponent": 6,
190+
"aliases": ["microtest"]
191+
}
192+
],
193+
"base": "utest",
194+
"display": "TEST",
195+
"name": "Test Token",
196+
"symbol": "TEST",
197+
"uri": "https://test.com",
198+
"uri_hash": "hash"
199+
});
200+
201+
let metadata_with_units: DenomMetadata = serde_json::from_value(json_with_units).unwrap();
202+
assert_eq!(metadata_with_units.denom_units.len(), 1);
203+
assert_eq!(metadata_with_units.denom_units[0].denom, "utest");
204+
assert_eq!(metadata_with_units.denom_units[0].aliases.len(), 1);
205+
assert_eq!(metadata_with_units.denom_units[0].aliases[0], "microtest");
206+
207+
// Test with null aliases inside denom_units - should deserialize as empty vec
208+
let json_with_null_aliases = json!({
209+
"description": "Test Token",
210+
"denom_units": [
211+
{
212+
"denom": "utest",
213+
"exponent": 6,
214+
"aliases": null
215+
}
216+
],
217+
"base": "utest",
218+
"display": "TEST",
219+
"name": "Test Token",
220+
"symbol": "TEST",
221+
"uri": "https://test.com",
222+
"uri_hash": "hash"
223+
});
224+
225+
let metadata_with_null_aliases: DenomMetadata =
226+
serde_json::from_value(json_with_null_aliases).unwrap();
227+
assert_eq!(metadata_with_null_aliases.denom_units.len(), 1);
228+
assert_eq!(
229+
metadata_with_null_aliases.denom_units[0].aliases,
230+
Vec::<String>::default()
231+
);
232+
assert!(metadata_with_null_aliases.denom_units[0].aliases.is_empty());
233+
}
234+
235+
#[test]
236+
fn query_denom_metadata_with_missing_fields_fails() {
237+
// Missing denom_units should be treated as default value (empty vec)
238+
let json_missing_denom_units = json!({
239+
"description": "Test Token",
240+
"base": "utest",
241+
"display": "TEST",
242+
"name": "Test Token",
243+
"symbol": "TEST",
244+
"uri": "https://test.com",
245+
"uri_hash": "hash"
246+
});
247+
248+
let json_missing_denom_units_metadata: Result<DenomMetadata, Error> =
249+
serde_json::from_value(json_missing_denom_units);
250+
assert!(json_missing_denom_units_metadata.is_err());
251+
252+
// Missing aliases field should be treated as default (empty vec)
253+
let json_missing_aliases = json!({
254+
"description": "Test Token",
255+
"denom_units": [
256+
{
257+
"denom": "utest",
258+
"exponent": 6
259+
}
260+
],
261+
"base": "utest",
262+
"display": "TEST",
263+
"name": "Test Token",
264+
"symbol": "TEST",
265+
"uri": "https://test.com",
266+
"uri_hash": "hash"
267+
});
268+
269+
let missing_aliases_metadata: Result<DenomMetadata, Error> =
270+
serde_json::from_value(json_missing_aliases);
271+
assert!(missing_aliases_metadata.is_err());
272+
}
273+
274+
#[test]
275+
fn query_denom_metadata_with_mixed_null_and_value_works() {
276+
// Test with multiple denom units, some with null aliases and some with values
277+
let mixed_json = json!({
278+
"description": "Mixed Token",
279+
"denom_units": [
280+
{
281+
"denom": "unit1",
282+
"exponent": 0,
283+
"aliases": null
284+
},
285+
{
286+
"denom": "unit2",
287+
"exponent": 6,
288+
"aliases": ["microunit", "u"]
289+
},
290+
{
291+
"denom": "unit3",
292+
"exponent": 9,
293+
"aliases": []
294+
}
295+
],
296+
"base": "unit1",
297+
"display": "MIXED",
298+
"name": "Mixed Token",
299+
"symbol": "MIX",
300+
"uri": "https://mixed.token",
301+
"uri_hash": "hash123"
302+
});
303+
304+
let metadata: DenomMetadata = serde_json::from_value(mixed_json).unwrap();
305+
306+
// First denom unit has null aliases, should be empty vec
307+
assert!(metadata.denom_units[0].aliases.is_empty());
308+
309+
// Second has two aliases
310+
assert_eq!(metadata.denom_units[1].aliases.len(), 2);
311+
assert_eq!(metadata.denom_units[1].aliases[0], "microunit");
312+
assert_eq!(metadata.denom_units[1].aliases[1], "u");
313+
314+
// Third has explicitly empty aliases
315+
assert!(metadata.denom_units[2].aliases.is_empty());
316+
}
317+
}

0 commit comments

Comments
 (0)