import { strict as assert } from 'node:assert'; import test from 'node:test'; import { XMLLoader } from '@loaders.gl/xml'; import { WMSCapabilitiesLoader, WMSErrorLoader, _WMSFeatureInfoLoader } from '@loaders.gl/wms'; const WMS_CAPABILITIES_XML = ` WMS Test Service alerts world image/png image/jpeg application/vnd.ogc.se_xml Root Layer EPSG:4326 -180 180 -90 90 alerts Alerts 2024-01-01/2024-12-31/P1D `; test('XMLLoader keeps namespace stripping + array paths stable', () => { const xml = 'okyo'; const parsed = XMLLoader.parseTextSync(xml, { xml: { removeNSPrefix: true, arrayPaths: ['root.Child'], }, }); assert.deepEqual(parsed, { root: { Child: [ { value: 'ok', attr: 'x' }, { value: 'yo', attr: 'y' }, ], }, }); }); test('WMSCapabilitiesLoader parses core typed fields from XML capabilities', () => { const parsed = WMSCapabilitiesLoader.parseTextSync(WMS_CAPABILITIES_XML); assert.equal(parsed.version, '1.3.0'); assert.equal(parsed.name, 'WMS'); assert.deepEqual(parsed.requests.GetMap.mimeTypes, ['image/png', 'image/jpeg']); assert.equal(parsed.layers.length, 1); const rootLayer = parsed.layers[0]; assert.deepEqual(rootLayer.geographicBoundingBox, [[-180, -90], [180, 90]]); const alertsLayer = rootLayer.layers[0]; assert.equal(alertsLayer.name, 'alerts'); assert.equal(alertsLayer.queryable, true); assert.deepEqual(alertsLayer.boundingBoxes[0], { crs: 'EPSG:4326', boundingBox: [[-10, -20], [30, 40]], }); assert.deepEqual(alertsLayer.dimensions[0], { name: 'time', units: 'ISO8601', extent: '2024-01-01/2024-12-31/P1D', defaultValue: '2024-01-01', nearestValue: true, }); }); test('WMSErrorLoader extracts namespaced error text and honors throw options', () => { const namespacedErrorXml = 'Bad layer'; const defaultMessage = WMSErrorLoader.parseTextSync(namespacedErrorXml); assert.equal(defaultMessage, 'WMS Service error: Bad layer'); const minimalMessage = WMSErrorLoader.parseTextSync(namespacedErrorXml, { wms: { minimalErrors: true }, }); assert.equal(minimalMessage, 'Bad layer'); assert.throws( () => WMSErrorLoader.parseTextSync(namespacedErrorXml, { wms: { throwOnError: true } }), /WMS Service error: Bad layer/ ); }); test('WMS feature info parsing remains stable for single and repeated FIELDS nodes', () => { const singleFieldsXml = ''; const manyFieldsXml = ''; const single = _WMSFeatureInfoLoader.parseTextSync(singleFieldsXml); const many = _WMSFeatureInfoLoader.parseTextSync(manyFieldsXml); assert.equal(single.features.length, 1); assert.deepEqual(single.features[0]?.attributes, { id: '1', label: 'one' }); assert.equal(many.features.length, 2); assert.equal(many.features[0]?.attributes?.id, '1'); assert.equal(many.features[1]?.attributes?.id, '2'); });