@itwin/map-layers-formats 4.1.0-dev.5 → 4.1.0-dev.50

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. package/.rush/temp/operation/build/all.log +0 -2
  2. package/.rush/temp/operation/build/state.json +1 -1
  3. package/.rush/temp/operation/cover/all.log +12 -7
  4. package/.rush/temp/operation/cover/state.json +1 -1
  5. package/.rush/temp/operation/docs/all.log +2 -2
  6. package/.rush/temp/operation/docs/state.json +1 -1
  7. package/.rush/temp/package-deps_build.json +9 -9
  8. package/.rush/temp/package-deps_cover.json +9 -9
  9. package/.rush/temp/package-deps_docs.json +9 -9
  10. package/.rush/temp/shrinkwrap-deps.json +70 -80
  11. package/CHANGELOG.json +57 -0
  12. package/CHANGELOG.md +44 -1
  13. package/lib/cjs/ArcGisFeature/ArcGisFeatureFormat.d.ts.map +1 -1
  14. package/lib/cjs/ArcGisFeature/ArcGisFeatureFormat.js +3 -0
  15. package/lib/cjs/ArcGisFeature/ArcGisFeatureFormat.js.map +1 -1
  16. package/lib/cjs/ArcGisFeature/ArcGisFeatureProvider.d.ts +3 -0
  17. package/lib/cjs/ArcGisFeature/ArcGisFeatureProvider.d.ts.map +1 -1
  18. package/lib/cjs/ArcGisFeature/ArcGisFeatureProvider.js +49 -11
  19. package/lib/cjs/ArcGisFeature/ArcGisFeatureProvider.js.map +1 -1
  20. package/lib/cjs/ArcGisFeature/ArcGisSymbologyRenderer.js +3 -3
  21. package/lib/cjs/ArcGisFeature/ArcGisSymbologyRenderer.js.map +1 -1
  22. package/lib/cjs/test/ArcGisFeature/ArcGisFeatureProvider.test.js +139 -7
  23. package/lib/cjs/test/ArcGisFeature/ArcGisFeatureProvider.test.js.map +1 -1
  24. package/lib/cjs/test/ArcGisFeature/Mocks.d.ts.map +1 -1
  25. package/lib/cjs/test/ArcGisFeature/Mocks.js +1 -1
  26. package/lib/cjs/test/ArcGisFeature/Mocks.js.map +1 -1
  27. package/lib/cjs/test/coverage/.nyc_output/49eeff8d-f0c9-43b5-9fa7-717e2ee4f36b.json +1 -0
  28. package/lib/cjs/test/coverage/.nyc_output/processinfo/49eeff8d-f0c9-43b5-9fa7-717e2ee4f36b.json +1 -0
  29. package/lib/cjs/test/coverage/.nyc_output/processinfo/b749190e-f7e9-4cdb-80df-74589d31e28d.json +1 -0
  30. package/lib/cjs/test/coverage/.nyc_output/processinfo/index.json +1 -1
  31. package/lib/cjs/test/coverage/cobertura-coverage.xml +295 -258
  32. package/lib/cjs/test/coverage/lcov-report/index.html +18 -18
  33. package/lib/cjs/test/coverage/lcov-report/src/ArcGisFeature/ArcGisFeatureFormat.ts.html +21 -9
  34. package/lib/cjs/test/coverage/lcov-report/src/ArcGisFeature/ArcGisFeatureJSON.ts.html +1 -1
  35. package/lib/cjs/test/coverage/lcov-report/src/ArcGisFeature/ArcGisFeaturePBF.ts.html +1 -1
  36. package/lib/cjs/test/coverage/lcov-report/src/ArcGisFeature/ArcGisFeatureProvider.ts.html +202 -76
  37. package/lib/cjs/test/coverage/lcov-report/src/ArcGisFeature/ArcGisFeatureQuery.ts.html +1 -1
  38. package/lib/cjs/test/coverage/lcov-report/src/ArcGisFeature/ArcGisFeatureReader.ts.html +1 -1
  39. package/lib/cjs/test/coverage/lcov-report/src/ArcGisFeature/ArcGisFeatureRenderer.ts.html +1 -1
  40. package/lib/cjs/test/coverage/lcov-report/src/ArcGisFeature/ArcGisFeatureResponse.ts.html +1 -1
  41. package/lib/cjs/test/coverage/lcov-report/src/ArcGisFeature/ArcGisSymbologyRenderer.ts.html +13 -13
  42. package/lib/cjs/test/coverage/lcov-report/src/ArcGisFeature/index.html +26 -26
  43. package/lib/cjs/test/coverage/lcov-report/src/index.html +1 -1
  44. package/lib/cjs/test/coverage/lcov-report/src/map-layers-formats.ts.html +1 -1
  45. package/lib/cjs/test/coverage/lcov-report/src/mapLayersFormats.ts.html +1 -1
  46. package/lib/cjs/test/coverage/lcov.info +429 -388
  47. package/lib/cjs/tsconfig.tsbuildinfo +1 -1
  48. package/lib/esm/ArcGisFeature/ArcGisFeatureFormat.d.ts.map +1 -1
  49. package/lib/esm/ArcGisFeature/ArcGisFeatureFormat.js +4 -1
  50. package/lib/esm/ArcGisFeature/ArcGisFeatureFormat.js.map +1 -1
  51. package/lib/esm/ArcGisFeature/ArcGisFeatureProvider.d.ts +3 -0
  52. package/lib/esm/ArcGisFeature/ArcGisFeatureProvider.d.ts.map +1 -1
  53. package/lib/esm/ArcGisFeature/ArcGisFeatureProvider.js +49 -11
  54. package/lib/esm/ArcGisFeature/ArcGisFeatureProvider.js.map +1 -1
  55. package/lib/esm/ArcGisFeature/ArcGisSymbologyRenderer.js +3 -3
  56. package/lib/esm/ArcGisFeature/ArcGisSymbologyRenderer.js.map +1 -1
  57. package/lib/esm/test/ArcGisFeature/ArcGisFeatureProvider.test.js +140 -8
  58. package/lib/esm/test/ArcGisFeature/ArcGisFeatureProvider.test.js.map +1 -1
  59. package/lib/esm/test/ArcGisFeature/Mocks.d.ts.map +1 -1
  60. package/lib/esm/test/ArcGisFeature/Mocks.js +1 -1
  61. package/lib/esm/test/ArcGisFeature/Mocks.js.map +1 -1
  62. package/lib/esm/tsconfig.tsbuildinfo +1 -1
  63. package/lib/test/junit_results.xml +53 -43
  64. package/map-layers-formats.build.cache.log +2 -0
  65. package/map-layers-formats.cover.log +103 -0
  66. package/{map-layers-formats.build.log → map-layers-formats.docs.log} +2 -2
  67. package/map-layers-formats.lint.error.log +1 -0
  68. package/map-layers-formats.lint.log +2 -0
  69. package/package.json +12 -12
  70. package/src/ArcGisFeature/ArcGisFeatureFormat.ts +5 -1
  71. package/src/ArcGisFeature/ArcGisFeatureProvider.ts +53 -11
  72. package/src/ArcGisFeature/ArcGisSymbologyRenderer.ts +3 -3
  73. package/src/test/ArcGisFeature/ArcGisFeatureProvider.test.ts +180 -8
  74. package/src/test/ArcGisFeature/Mocks.ts +1 -1
  75. package/lib/cjs/test/coverage/.nyc_output/97a409cb-0529-4dd9-9185-4c9a271c836a.json +0 -1
  76. package/lib/cjs/test/coverage/.nyc_output/processinfo/530a1eef-b22f-4875-a81e-1eabc667f480.json +0 -1
  77. package/lib/cjs/test/coverage/.nyc_output/processinfo/97a409cb-0529-4dd9-9185-4c9a271c836a.json +0 -1
  78. /package/lib/cjs/test/coverage/.nyc_output/{530a1eef-b22f-4875-a81e-1eabc667f480.json → b749190e-f7e9-4cdb-80df-74589d31e28d.json} +0 -0
@@ -13,19 +13,24 @@ import { NewYorkDataset } from "./NewYorkDataset";
13
13
  import { base64StringToUint8Array, ByteStream, Logger } from "@itwin/core-bentley";
14
14
  import { PhillyLandmarksDataset } from "./PhillyLandmarksDataset";
15
15
  import { ArcGisFeatureResponse } from "../../ArcGisFeature/ArcGisFeatureResponse";
16
- import { Point3d } from "@itwin/core-geometry";
16
+ import { Angle, Point3d } from "@itwin/core-geometry";
17
17
  import { ArcGisFeaturePBF } from "../../ArcGisFeature/ArcGisFeaturePBF";
18
18
  import { ArcGisFeatureJSON } from "../../ArcGisFeature/ArcGisFeatureJSON";
19
19
  const expect = chai.expect;
20
20
  chai.use(chaiAsPromised);
21
- const esriFeatureSampleSource = { name: "dummyFeatureLayer", url: "https://dummy.com", formatId: ArcGisFeatureMapLayerFormat.formatId };
21
+ const esriFeatureSampleSource = { name: "dummyFeatureLayer", url: "https://dummy.com/SomeGuid/ArcGIS/rest/services/SomeService/FeatureServer", formatId: ArcGisFeatureMapLayerFormat.formatId };
22
22
  const pngTransparent1x1 = "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNkYPhfDwAChwGA60e6kgAAAABJRU5ErkJggg==";
23
23
  describe("ArcGisFeatureProvider", () => {
24
24
  const sandbox = sinon.createSandbox();
25
+ let fetchStub;
26
+ beforeEach(async () => {
27
+ // Make sure no call to fetch is made, other it creates leaks
28
+ fetchStub = sandbox.stub(ArcGISImageryProvider.prototype, "fetch");
29
+ });
25
30
  afterEach(async () => {
26
31
  sandbox.restore();
27
32
  });
28
- it("should initialize with valid data", async () => {
33
+ it("should initialize with valid service metadata", async () => {
29
34
  sandbox.stub(ArcGisUtilities, "getServiceJson").callsFake(async function _(_url, _formatId, _userName, _password, _ignoreCache, _requireToken) {
30
35
  return { accessTokenRequired: false, content: NewYorkDataset.serviceCapabilities };
31
36
  });
@@ -38,6 +43,133 @@ describe("ArcGisFeatureProvider", () => {
38
43
  expect(provider._minDepthFromLod).to.equals(11);
39
44
  expect(provider._maxDepthFromLod).to.equals(22);
40
45
  });
46
+ it("should initialize and set cartoRange without making extra extent request", async () => {
47
+ sandbox.stub(ArcGisUtilities, "getServiceJson").callsFake(async function _(_url, _formatId, _userName, _password, _ignoreCache, _requireToken) {
48
+ return { accessTokenRequired: false, content: NewYorkDataset.serviceCapabilities };
49
+ });
50
+ sandbox.stub(ArcGisFeatureProvider.prototype, "getLayerMetadata").callsFake(async function _(_layerId) {
51
+ return NewYorkDataset.streetsLayerCapabilities;
52
+ });
53
+ const setCartoSpy = sandbox.spy(ArcGisFeatureProvider.prototype, "setCartoRangeFromExtentJson");
54
+ const fetchLayerExtentSpy = sandbox.spy(ArcGisFeatureProvider.prototype, "fetchLayerExtent");
55
+ const settings = ImageMapLayerSettings.fromJSON(esriFeatureSampleSource);
56
+ const provider = new ArcGisFeatureProvider(settings);
57
+ await provider.initialize();
58
+ expect(setCartoSpy.called).to.be.true;
59
+ expect(setCartoSpy.args[0][0]).to.be.equals(NewYorkDataset.streetsLayerCapabilities.extent);
60
+ expect(fetchLayerExtentSpy.called).to.be.false;
61
+ });
62
+ it("should make an extra extent request when none available in layer metadata", async () => {
63
+ sandbox.stub(ArcGisUtilities, "getServiceJson").callsFake(async function _(_url, _formatId, _userName, _password, _ignoreCache, _requireToken) {
64
+ return { accessTokenRequired: false, content: NewYorkDataset.serviceCapabilities };
65
+ });
66
+ const setCartoSpy = sandbox.spy(ArcGisFeatureProvider.prototype, "setCartoRangeFromExtentJson");
67
+ const layerExtent = { ...NewYorkDataset.streetsLayerCapabilities.extent };
68
+ const fetchLayerExtentStub = sandbox.stub(ArcGisFeatureProvider.prototype, "fetchLayerExtent").callsFake(async function _(_layerId) {
69
+ return layerExtent;
70
+ });
71
+ const layerCapabilitiesNoExtent = { ...NewYorkDataset.streetsLayerCapabilities, extent: null };
72
+ sandbox.stub(ArcGisFeatureProvider.prototype, "getLayerMetadata").callsFake(async function _(_layerId) {
73
+ return layerCapabilitiesNoExtent;
74
+ });
75
+ const settings = ImageMapLayerSettings.fromJSON(esriFeatureSampleSource);
76
+ const provider = new ArcGisFeatureProvider(settings);
77
+ await provider.initialize();
78
+ expect(fetchLayerExtentStub.called).to.be.true;
79
+ expect(setCartoSpy.called).to.be.true;
80
+ expect(setCartoSpy.args[0][0]).to.be.equals(layerExtent);
81
+ });
82
+ it("should make an extra extent request when none available in layer metadata", async () => {
83
+ sandbox.stub(ArcGisUtilities, "getServiceJson").callsFake(async function _(_url, _formatId, _userName, _password, _ignoreCache, _requireToken) {
84
+ return { accessTokenRequired: false, content: NewYorkDataset.serviceCapabilities };
85
+ });
86
+ const setCartoSpy = sandbox.spy(ArcGisFeatureProvider.prototype, "setCartoRangeFromExtentJson");
87
+ const layerExtent = { ...NewYorkDataset.streetsLayerCapabilities.extent };
88
+ const fetchLayerExtentStub = sandbox.stub(ArcGisFeatureProvider.prototype, "fetchLayerExtent").callsFake(async function _(_layerId) {
89
+ return layerExtent;
90
+ });
91
+ const layerExtentBadSrs = { ...NewYorkDataset.streetsLayerCapabilities };
92
+ layerExtentBadSrs.extent.spatialReference.wkid = 1234;
93
+ layerExtentBadSrs.extent.spatialReference.latestWkid = 1234;
94
+ sandbox.stub(ArcGisFeatureProvider.prototype, "getLayerMetadata").callsFake(async function _(_layerId) {
95
+ return layerExtentBadSrs;
96
+ });
97
+ const settings = ImageMapLayerSettings.fromJSON(esriFeatureSampleSource);
98
+ const provider = new ArcGisFeatureProvider(settings);
99
+ await provider.initialize();
100
+ expect(fetchLayerExtentStub.called).to.be.true;
101
+ expect(setCartoSpy.called).to.be.true;
102
+ expect(setCartoSpy.args[0][0]).to.be.equals(layerExtent);
103
+ });
104
+ it("should set cartoRange from Extent json", async () => {
105
+ const newYorkLayerExtent = NewYorkDataset.streetsLayerCapabilities.extent;
106
+ const settings = ImageMapLayerSettings.fromJSON(esriFeatureSampleSource);
107
+ const provider = new ArcGisFeatureProvider(settings);
108
+ const west = provider.getEPSG4326Lon(newYorkLayerExtent.xmin);
109
+ const south = provider.getEPSG4326Lat(newYorkLayerExtent.ymin);
110
+ const east = provider.getEPSG4326Lon(newYorkLayerExtent.xmax);
111
+ const north = provider.getEPSG4326Lat(newYorkLayerExtent.ymax);
112
+ provider.setCartoRangeFromExtentJson(newYorkLayerExtent);
113
+ expect(provider.cartoRange).to.be.not.undefined;
114
+ const delta = 0.0000001;
115
+ expect(provider.cartoRange.west * Angle.degreesPerRadian).to.approximately(west, delta);
116
+ expect(provider.cartoRange.south * Angle.degreesPerRadian).to.approximately(south, delta);
117
+ expect(provider.cartoRange.east * Angle.degreesPerRadian).to.approximately(east, delta);
118
+ expect(provider.cartoRange.north * Angle.degreesPerRadian).to.approximately(north, delta);
119
+ });
120
+ it("should compose proper request to get extent", async () => {
121
+ fetchStub.restore(); // fetch is always stubbed by default, restore and provide our own stub
122
+ sandbox.stub(ArcGisUtilities, "getServiceJson").callsFake(async function _(_url, _formatId, _userName, _password, _ignoreCache, _requireToken) {
123
+ return { accessTokenRequired: false, content: NewYorkDataset.serviceCapabilities };
124
+ });
125
+ const layerCapabilitiesNoExtent = { ...NewYorkDataset.streetsLayerCapabilities };
126
+ sandbox.stub(ArcGisFeatureProvider.prototype, "getLayerMetadata").callsFake(async function _(_layerId) {
127
+ return layerCapabilitiesNoExtent;
128
+ });
129
+ const referenceExtent = { extent: NewYorkDataset.streetsLayerCapabilities.extent };
130
+ const stub = sandbox.stub(ArcGISImageryProvider.prototype, "fetch").callsFake(async function _(_url, _options) {
131
+ const test = {
132
+ headers: { "content-type": "json" },
133
+ json: async () => {
134
+ return referenceExtent;
135
+ },
136
+ status: 200,
137
+ }; // By using unknown type, I can define parts of Response I really need
138
+ return test;
139
+ });
140
+ let layerId = 0;
141
+ let expectedUrl = `https://dummy.com/SomeGuid/ArcGIS/rest/services/SomeService/FeatureServer/${layerId}/query?where=1%3D1&outSR=3857&returnExtentOnly=true&f=json`;
142
+ let cachedExtent = ArcGisFeatureProvider._extentCache.get(expectedUrl);
143
+ expect(cachedExtent).to.be.undefined;
144
+ const settings = ImageMapLayerSettings.fromJSON(esriFeatureSampleSource);
145
+ const provider = new ArcGisFeatureProvider(settings);
146
+ await provider.initialize();
147
+ let fetchExtent = await provider.fetchLayerExtent();
148
+ expect(fetchExtent).to.equals(referenceExtent.extent);
149
+ expect(stub.getCalls().length).to.equals(1);
150
+ expect(stub.args[0][0].toString()).to.be.equals(expectedUrl);
151
+ // Check if entry has been created in cache
152
+ cachedExtent = ArcGisFeatureProvider._extentCache.get(expectedUrl);
153
+ expect(cachedExtent).to.be.not.undefined;
154
+ expect(cachedExtent).to.equals(referenceExtent);
155
+ // Make sure cache is used
156
+ await provider.fetchLayerExtent();
157
+ expect(stub.getCalls().length).to.equals(1);
158
+ // Force a different layerId, and check a new request has been made
159
+ layerId = 2;
160
+ expectedUrl = `https://dummy.com/SomeGuid/ArcGIS/rest/services/SomeService/FeatureServer/${layerId}/query?where=1%3D1&outSR=3857&returnExtentOnly=true&f=json`;
161
+ cachedExtent = ArcGisFeatureProvider._extentCache.get(expectedUrl);
162
+ expect(cachedExtent).to.be.undefined;
163
+ provider._layerId = layerId;
164
+ fetchExtent = await provider.fetchLayerExtent();
165
+ expect(fetchExtent).to.equals(referenceExtent.extent);
166
+ expect(stub.getCalls().length).to.equals(2);
167
+ expect(stub.args[1][0].toString()).to.be.equals(expectedUrl);
168
+ // check cache has been updated with a new entry
169
+ cachedExtent = ArcGisFeatureProvider._extentCache.get(expectedUrl);
170
+ expect(cachedExtent).to.be.not.undefined;
171
+ expect(cachedExtent).to.equals(referenceExtent);
172
+ });
41
173
  it("should not initialize with no service metadata", async () => {
42
174
  sandbox.stub(ArcGisUtilities, "getServiceJson").callsFake(async function _(_url, _formatId, _userName, _password, _ignoreCache, _requireToken) {
43
175
  return undefined;
@@ -231,7 +363,7 @@ describe("ArcGisFeatureProvider", () => {
231
363
  latestWkid: 3857,
232
364
  },
233
365
  };
234
- expect(url?.url).to.equals(`https://dummy.com/0/query?f=PBF&resultType=tile&maxRecordCountFactor=3&returnExceededLimitFeatures=false&outSR=102100&geometryType=esriGeometryEnvelope&geometry=%7B%22xmin%22%3A-20037508.34%2C%22ymin%22%3A-20037508.339999996%2C%22xmax%22%3A20037508.34%2C%22ymax%22%3A20037508.340000004%2C%22spatialReference%22%3A%7B%22wkid%22%3A102100%2C%22latestWkid%22%3A3857%7D%7D&units=esriSRUnit_Meter&inSR=102100`);
366
+ expect(url?.url).to.equals("https://dummy.com/SomeGuid/ArcGIS/rest/services/SomeService/FeatureServer/0/query?f=PBF&resultType=tile&maxRecordCountFactor=3&returnExceededLimitFeatures=false&outSR=102100&geometryType=esriGeometryEnvelope&geometry=%7B%22xmin%22%3A-20037508.34%2C%22ymin%22%3A-20037508.339999996%2C%22xmax%22%3A20037508.34%2C%22ymax%22%3A20037508.340000004%2C%22spatialReference%22%3A%7B%22wkid%22%3A102100%2C%22latestWkid%22%3A3857%7D%7D&units=esriSRUnit_Meter&inSR=102100");
235
367
  expect(url?.envelope?.xmin).to.be.closeTo(extent.xmin, 0.01);
236
368
  expect(url?.envelope?.ymin).to.be.closeTo(extent.ymin, 0.01);
237
369
  expect(url?.envelope?.xmax).to.be.closeTo(extent.xmax, 0.01);
@@ -250,7 +382,7 @@ describe("ArcGisFeatureProvider", () => {
250
382
  const provider2 = new ArcGisFeatureProvider(settings);
251
383
  await provider2.initialize();
252
384
  url = provider2.constructFeatureUrl(0, 0, 0, "PBF");
253
- expect(url?.url).to.equals(`https://dummy.com/0/query?f=PBF&resultType=tile&maxRecordCountFactor=3&returnExceededLimitFeatures=false&outSR=102100&geometryType=esriGeometryEnvelope&geometry=%7B%22xmin%22%3A-20037508.34%2C%22ymin%22%3A-20037508.339999996%2C%22xmax%22%3A20037508.34%2C%22ymax%22%3A20037508.340000004%2C%22spatialReference%22%3A%7B%22wkid%22%3A102100%2C%22latestWkid%22%3A3857%7D%7D&units=esriSRUnit_Meter&inSR=102100&quantizationParameters=%7B%22mode%22%3A%22view%22%2C%22originPosition%22%3A%22upperLeft%22%2C%22tolerance%22%3A78271.516953125%2C%22extent%22%3A%7B%22xmin%22%3A-20037508.34%2C%22ymin%22%3A-20037508.339999996%2C%22xmax%22%3A20037508.34%2C%22ymax%22%3A20037508.340000004%2C%22spatialReference%22%3A%7B%22wkid%22%3A102100%2C%22latestWkid%22%3A3857%7D%7D%7D`);
385
+ expect(url?.url).to.equals("https://dummy.com/SomeGuid/ArcGIS/rest/services/SomeService/FeatureServer/0/query?f=PBF&resultType=tile&maxRecordCountFactor=3&returnExceededLimitFeatures=false&outSR=102100&geometryType=esriGeometryEnvelope&geometry=%7B%22xmin%22%3A-20037508.34%2C%22ymin%22%3A-20037508.339999996%2C%22xmax%22%3A20037508.34%2C%22ymax%22%3A20037508.340000004%2C%22spatialReference%22%3A%7B%22wkid%22%3A102100%2C%22latestWkid%22%3A3857%7D%7D&units=esriSRUnit_Meter&inSR=102100&quantizationParameters=%7B%22mode%22%3A%22view%22%2C%22originPosition%22%3A%22upperLeft%22%2C%22tolerance%22%3A78271.516953125%2C%22extent%22%3A%7B%22xmin%22%3A-20037508.34%2C%22ymin%22%3A-20037508.339999996%2C%22xmax%22%3A20037508.34%2C%22ymax%22%3A20037508.340000004%2C%22spatialReference%22%3A%7B%22wkid%22%3A102100%2C%22latestWkid%22%3A3857%7D%7D%7D");
254
386
  expect(url?.envelope?.xmin).to.be.closeTo(extent.xmin, 0.01);
255
387
  expect(url?.envelope?.ymin).to.be.closeTo(extent.ymin, 0.01);
256
388
  expect(url?.envelope?.xmax).to.be.closeTo(extent.xmax, 0.01);
@@ -274,7 +406,7 @@ describe("ArcGisFeatureProvider", () => {
274
406
  const provider3 = new ArcGisFeatureProvider(settings);
275
407
  await provider3.initialize();
276
408
  url = provider3.constructFeatureUrl(0, 0, 0, "PBF", overrideGeom);
277
- expect(url?.url).to.equals(`https://dummy.com/0/query?f=PBF&resultType=tile&maxRecordCountFactor=3&returnExceededLimitFeatures=false&outSR=102100&geometryType=esriGeometryEnvelope&geometry=%7B%22xmin%22%3A-50%2C%22ymin%22%3A-50%2C%22xmax%22%3A50%2C%22ymax%22%3A50%2C%22spatialReference%22%3A%7B%22wkid%22%3A102100%2C%22latestWkid%22%3A3857%7D%7D&units=esriSRUnit_Meter&inSR=102100&quantizationParameters=%7B%22mode%22%3A%22view%22%2C%22originPosition%22%3A%22upperLeft%22%2C%22tolerance%22%3A78271.516953125%2C%22extent%22%3A%7B%22xmin%22%3A-20037508.34%2C%22ymin%22%3A-20037508.339999996%2C%22xmax%22%3A20037508.34%2C%22ymax%22%3A20037508.340000004%2C%22spatialReference%22%3A%7B%22wkid%22%3A102100%2C%22latestWkid%22%3A3857%7D%7D%7D`);
409
+ expect(url?.url).to.equals("https://dummy.com/SomeGuid/ArcGIS/rest/services/SomeService/FeatureServer/0/query?f=PBF&resultType=tile&maxRecordCountFactor=3&returnExceededLimitFeatures=false&outSR=102100&geometryType=esriGeometryEnvelope&geometry=%7B%22xmin%22%3A-50%2C%22ymin%22%3A-50%2C%22xmax%22%3A50%2C%22ymax%22%3A50%2C%22spatialReference%22%3A%7B%22wkid%22%3A102100%2C%22latestWkid%22%3A3857%7D%7D&units=esriSRUnit_Meter&inSR=102100&quantizationParameters=%7B%22mode%22%3A%22view%22%2C%22originPosition%22%3A%22upperLeft%22%2C%22tolerance%22%3A78271.516953125%2C%22extent%22%3A%7B%22xmin%22%3A-20037508.34%2C%22ymin%22%3A-20037508.339999996%2C%22xmax%22%3A20037508.34%2C%22ymax%22%3A20037508.340000004%2C%22spatialReference%22%3A%7B%22wkid%22%3A102100%2C%22latestWkid%22%3A3857%7D%7D%7D");
278
410
  expect(url?.envelope?.xmin).to.be.closeTo(overrideGeom.geom.xmin, 0.01);
279
411
  expect(url?.envelope?.ymin).to.be.closeTo(overrideGeom.geom.ymin, 0.01);
280
412
  expect(url?.envelope?.xmax).to.be.closeTo(overrideGeom.geom.xmax, 0.01);
@@ -283,7 +415,7 @@ describe("ArcGisFeatureProvider", () => {
283
415
  expect(url?.envelope?.spatialReference.latestWkid).to.be.equal(overrideGeom.geom.spatialReference.latestWkid);
284
416
  // Now test with a different tolerance value
285
417
  url = provider3.constructFeatureUrl(0, 0, 0, "PBF", overrideGeom, undefined, 10);
286
- expect(url?.url).to.equals(`https://dummy.com/0/query?f=PBF&resultType=tile&maxRecordCountFactor=3&returnExceededLimitFeatures=false&outSR=102100&geometryType=esriGeometryEnvelope&geometry=%7B%22xmin%22%3A-50%2C%22ymin%22%3A-50%2C%22xmax%22%3A50%2C%22ymax%22%3A50%2C%22spatialReference%22%3A%7B%22wkid%22%3A102100%2C%22latestWkid%22%3A3857%7D%7D&units=esriSRUnit_Meter&inSR=102100&quantizationParameters=%7B%22mode%22%3A%22view%22%2C%22originPosition%22%3A%22upperLeft%22%2C%22tolerance%22%3A78271.516953125%2C%22extent%22%3A%7B%22xmin%22%3A-20037508.34%2C%22ymin%22%3A-20037508.339999996%2C%22xmax%22%3A20037508.34%2C%22ymax%22%3A20037508.340000004%2C%22spatialReference%22%3A%7B%22wkid%22%3A102100%2C%22latestWkid%22%3A3857%7D%7D%7D&distance=782715.16953125`);
418
+ expect(url?.url).to.equals("https://dummy.com/SomeGuid/ArcGIS/rest/services/SomeService/FeatureServer/0/query?f=PBF&resultType=tile&maxRecordCountFactor=3&returnExceededLimitFeatures=false&outSR=102100&geometryType=esriGeometryEnvelope&geometry=%7B%22xmin%22%3A-50%2C%22ymin%22%3A-50%2C%22xmax%22%3A50%2C%22ymax%22%3A50%2C%22spatialReference%22%3A%7B%22wkid%22%3A102100%2C%22latestWkid%22%3A3857%7D%7D&units=esriSRUnit_Meter&inSR=102100&quantizationParameters=%7B%22mode%22%3A%22view%22%2C%22originPosition%22%3A%22upperLeft%22%2C%22tolerance%22%3A78271.516953125%2C%22extent%22%3A%7B%22xmin%22%3A-20037508.34%2C%22ymin%22%3A-20037508.339999996%2C%22xmax%22%3A20037508.34%2C%22ymax%22%3A20037508.340000004%2C%22spatialReference%22%3A%7B%22wkid%22%3A102100%2C%22latestWkid%22%3A3857%7D%7D%7D&distance=782715.16953125");
287
419
  expect(url?.envelope?.xmin).to.be.closeTo(overrideGeom.geom.xmin, 0.01);
288
420
  expect(url?.envelope?.ymin).to.be.closeTo(overrideGeom.geom.ymin, 0.01);
289
421
  expect(url?.envelope?.xmax).to.be.closeTo(overrideGeom.geom.xmax, 0.01);
@@ -335,6 +467,7 @@ describe("ArcGisFeatureProvider", () => {
335
467
  sandbox.stub(ArcGisUtilities, "getServiceJson").callsFake(async function _(_url, _formatId, _userName, _password, _ignoreCache, _requireToken) {
336
468
  return { accessTokenRequired: false, content: { currentVersion: 11, capabilities: "Query" } };
337
469
  });
470
+ fetchStub.restore(); // fetch is always stubbed by default, restore and provide our own stub
338
471
  sandbox.stub(ArcGISImageryProvider.prototype, "fetch").callsFake(async function _(_url, _options) {
339
472
  const test = {
340
473
  headers: { "content-type": "pbf" },
@@ -662,7 +795,6 @@ describe("ArcGisFeatureProvider", () => {
662
795
  sandbox.stub(ArcGisUtilities, "getServiceJson").callsFake(async function _(_url, _formatId, _userName, _password, _ignoreCache, _requireToken) {
663
796
  return { accessTokenRequired: false, content: { capabilities: "Query" } };
664
797
  });
665
- const fetchStub = sandbox.stub(ArcGISImageryProvider.prototype, "fetch");
666
798
  sandbox.stub(ArcGisFeatureProvider.prototype, "constructFeatureUrl").callsFake(function _(_row, _column, _zoomLevel, _format, _geomOverride, _outFields, _tolerance, _returnGeometry) {
667
799
  return { url: settings.url };
668
800
  });