sintfacilis 1.0.0

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 (461) hide show
  1. package/.env.example +2 -0
  2. package/.eslintrc.js +20 -0
  3. package/.github/workflows/deploy-docs.yml +27 -0
  4. package/.github/workflows/pre-release-tests.yml +45 -0
  5. package/.github/workflows/pull-request-tests.yml +45 -0
  6. package/.prettierignore +2 -0
  7. package/.prettierrc +19 -0
  8. package/.vscode/launch.json +24 -0
  9. package/.vscode/settings.json +3 -0
  10. package/codecov.yml +7 -0
  11. package/demos/.eslintrc.js +13 -0
  12. package/demos/ago-node-cli/README.md +29 -0
  13. package/demos/ago-node-cli/ago.js +33 -0
  14. package/demos/ago-node-cli/index.js +11 -0
  15. package/demos/ago-node-cli/lib/item-export-command.js +48 -0
  16. package/demos/ago-node-cli/lib/item-search-command.js +35 -0
  17. package/demos/ago-node-cli/package-lock.json +430 -0
  18. package/demos/ago-node-cli/package.json +30 -0
  19. package/demos/attachments/README.md +5 -0
  20. package/demos/attachments/index.html +165 -0
  21. package/demos/attachments/package-lock.json +543 -0
  22. package/demos/attachments/package.json +18 -0
  23. package/demos/batch-geocoder-node/NYC_Restaurant_Inspection_Results.csv +100 -0
  24. package/demos/batch-geocoder-node/README.md +15 -0
  25. package/demos/batch-geocoder-node/batch-geocode.js +115 -0
  26. package/demos/batch-geocoder-node/config-template.js +18 -0
  27. package/demos/batch-geocoder-node/package-lock.json +336 -0
  28. package/demos/batch-geocoder-node/package.json +37 -0
  29. package/demos/express/README.md +15 -0
  30. package/demos/express/config.json.template +3 -0
  31. package/demos/express/package-lock.json +1008 -0
  32. package/demos/express/package.json +18 -0
  33. package/demos/express/server.js +33 -0
  34. package/demos/feature-service-browser/README.md +6 -0
  35. package/demos/feature-service-browser/index.html +122 -0
  36. package/demos/feature-service-browser/package-lock.json +543 -0
  37. package/demos/feature-service-browser/package.json +18 -0
  38. package/demos/geocoder-browser/README.md +10 -0
  39. package/demos/geocoder-browser/config.js.template +1 -0
  40. package/demos/geocoder-browser/index.html +131 -0
  41. package/demos/geocoder-browser/package-lock.json +610 -0
  42. package/demos/geocoder-browser/package.json +19 -0
  43. package/demos/geocoder-browser/post-sign-in.html +25 -0
  44. package/demos/jsapi-integration/README.md +25 -0
  45. package/demos/jsapi-integration/config.js +6 -0
  46. package/demos/jsapi-integration/index.html +93 -0
  47. package/demos/jsapi-integration/package-lock.json +247 -0
  48. package/demos/jsapi-integration/package.json +19 -0
  49. package/demos/node-cli-item-management/README.md +10 -0
  50. package/demos/node-cli-item-management/index.js +238 -0
  51. package/demos/node-cli-item-management/package-lock.json +432 -0
  52. package/demos/node-cli-item-management/package.json +27 -0
  53. package/demos/node-cli-item-management/screenshot.png +0 -0
  54. package/demos/oauth2-browser/README.md +14 -0
  55. package/demos/oauth2-browser/authenticate.html +30 -0
  56. package/demos/oauth2-browser/config.js.template +6 -0
  57. package/demos/oauth2-browser/index.html +211 -0
  58. package/demos/oauth2-browser/logo.svg +4 -0
  59. package/demos/oauth2-browser/package-lock.json +474 -0
  60. package/demos/oauth2-browser/package.json +18 -0
  61. package/demos/oauth2-browser/style.css +36 -0
  62. package/demos/oauth2-browser-retry/README.md +25 -0
  63. package/demos/oauth2-browser-retry/authenticate.html +22 -0
  64. package/demos/oauth2-browser-retry/index.html +116 -0
  65. package/demos/oauth2-browser-retry/logo.svg +4 -0
  66. package/demos/stream-response-to-file/README.md +7 -0
  67. package/demos/stream-response-to-file/index.js +36 -0
  68. package/demos/stream-response-to-file/output/.gitkeep +0 -0
  69. package/demos/stream-response-to-file/package-lock.json +227 -0
  70. package/demos/stream-response-to-file/package.json +33 -0
  71. package/demos/tree-shaking-rollup/.babelrc +3 -0
  72. package/demos/tree-shaking-rollup/README.md +9 -0
  73. package/demos/tree-shaking-rollup/index.html +11 -0
  74. package/demos/tree-shaking-rollup/package-lock.json +5646 -0
  75. package/demos/tree-shaking-rollup/package.json +25 -0
  76. package/demos/tree-shaking-rollup/rollup.config.js +17 -0
  77. package/demos/tree-shaking-rollup/src/index.js +8 -0
  78. package/demos/tree-shaking-webpack/README.md +8 -0
  79. package/demos/tree-shaking-webpack/index.html +11 -0
  80. package/demos/tree-shaking-webpack/package-lock.json +11455 -0
  81. package/demos/tree-shaking-webpack/package.json +24 -0
  82. package/demos/tree-shaking-webpack/src/index.js +10 -0
  83. package/demos/tree-shaking-webpack/webpack.config.js +27 -0
  84. package/demos/vue/.env.example +11 -0
  85. package/demos/vue/.eslintrc.js +17 -0
  86. package/demos/vue/.postcssrc.js +5 -0
  87. package/demos/vue/README.md +17 -0
  88. package/demos/vue/babel.config.js +3 -0
  89. package/demos/vue/package-lock.json +28044 -0
  90. package/demos/vue/package.json +33 -0
  91. package/demos/vue/public/favicon.ico +0 -0
  92. package/demos/vue/public/index.html +24 -0
  93. package/demos/vue/src/assets/logo.svg +29 -0
  94. package/demos/vue/src/components/App.vue +305 -0
  95. package/demos/vue/src/components/Authenticate.vue +65 -0
  96. package/demos/vue/src/components/Loader.vue +230 -0
  97. package/demos/vue/src/main.js +92 -0
  98. package/demos/webmap-checker-sapper/.env.example +5 -0
  99. package/demos/webmap-checker-sapper/README.md +123 -0
  100. package/demos/webmap-checker-sapper/appveyor.yml +18 -0
  101. package/demos/webmap-checker-sapper/cypress/fixtures/example.json +5 -0
  102. package/demos/webmap-checker-sapper/cypress/integration/spec.js +19 -0
  103. package/demos/webmap-checker-sapper/cypress/plugins/index.js +17 -0
  104. package/demos/webmap-checker-sapper/cypress/support/commands.js +25 -0
  105. package/demos/webmap-checker-sapper/cypress/support/index.js +20 -0
  106. package/demos/webmap-checker-sapper/cypress.json +4 -0
  107. package/demos/webmap-checker-sapper/package-lock.json +9622 -0
  108. package/demos/webmap-checker-sapper/package.json +50 -0
  109. package/demos/webmap-checker-sapper/rollup.config.js +87 -0
  110. package/demos/webmap-checker-sapper/src/client.js +20 -0
  111. package/demos/webmap-checker-sapper/src/components/LayerStatus.html +108 -0
  112. package/demos/webmap-checker-sapper/src/components/Nav.html +21 -0
  113. package/demos/webmap-checker-sapper/src/components/WebMap.html +62 -0
  114. package/demos/webmap-checker-sapper/src/routes/_error.html +41 -0
  115. package/demos/webmap-checker-sapper/src/routes/_layout.html +21 -0
  116. package/demos/webmap-checker-sapper/src/routes/auth/authorize.js +18 -0
  117. package/demos/webmap-checker-sapper/src/routes/auth/exchange-token.js +20 -0
  118. package/demos/webmap-checker-sapper/src/routes/auth/post-sign-in.js +24 -0
  119. package/demos/webmap-checker-sapper/src/routes/auth/sign-out.js +10 -0
  120. package/demos/webmap-checker-sapper/src/routes/index.html +20 -0
  121. package/demos/webmap-checker-sapper/src/routes/webmaps/[webmapId].html +83 -0
  122. package/demos/webmap-checker-sapper/src/routes/webmaps/index.html +59 -0
  123. package/demos/webmap-checker-sapper/src/server.js +101 -0
  124. package/demos/webmap-checker-sapper/src/service-worker.js +82 -0
  125. package/demos/webmap-checker-sapper/src/template.html +33 -0
  126. package/demos/webmap-checker-sapper/src/userInfoMiddleware.js +21 -0
  127. package/demos/webmap-checker-sapper/src/utils.js +33 -0
  128. package/demos/webmap-checker-sapper/static/favicon.png +0 -0
  129. package/demos/webmap-checker-sapper/static/global.css +36 -0
  130. package/demos/webmap-checker-sapper/static/manifest.json +20 -0
  131. package/demos/webmap-checker-sapper/static/svelte-logo-192.png +0 -0
  132. package/demos/webmap-checker-sapper/static/svelte-logo-512.png +0 -0
  133. package/docs/.eslintrc.js +12 -0
  134. package/docs/FAQ.md +48 -0
  135. package/docs/HISTORY.md +62 -0
  136. package/docs/acetate.config.js +262 -0
  137. package/docs/build-typedoc.js +434 -0
  138. package/docs/generate-srihashes.js +53 -0
  139. package/docs/src/_layout.html +86 -0
  140. package/docs/src/api/_declaration.html +600 -0
  141. package/docs/src/api/_layout.html +204 -0
  142. package/docs/src/api/_package.html +38 -0
  143. package/docs/src/api/index.html +16 -0
  144. package/docs/src/guides/_layout.html +24 -0
  145. package/docs/src/guides/amd-requirejs-dojo.md +40 -0
  146. package/docs/src/guides/browser-authentication.md +39 -0
  147. package/docs/src/guides/bundlers.md +52 -0
  148. package/docs/src/guides/cli-authentication.md +9 -0
  149. package/docs/src/guides/client-server-authentication.md +9 -0
  150. package/docs/src/guides/embedded-apps.md +106 -0
  151. package/docs/src/guides/from-a-cdn.md +38 -0
  152. package/docs/src/guides/index.md +59 -0
  153. package/docs/src/guides/node.md +104 -0
  154. package/docs/src/guides/package-overview.md +111 -0
  155. package/docs/src/guides/server-authentication.md +9 -0
  156. package/docs/src/guides/whats-new-v2-0.md +305 -0
  157. package/docs/src/img/icons.png +0 -0
  158. package/docs/src/img/icons@2x.png +0 -0
  159. package/docs/src/img/oauth-browser.png +0 -0
  160. package/docs/src/index.html +12 -0
  161. package/docs/src/js/api-search.js +112 -0
  162. package/docs/src/js/nav-toggle.js +41 -0
  163. package/docs/src/sass/_highlight.scss +96 -0
  164. package/docs/src/sass/_icons.scss +157 -0
  165. package/docs/src/sass/style.scss +242 -0
  166. package/docs/src/srihashes.json +12 -0
  167. package/jasmine.json +7 -0
  168. package/jasmine.live.json +7 -0
  169. package/karma.conf.js +107 -0
  170. package/lerna.json +8 -0
  171. package/notes/README.md +68 -0
  172. package/package.json +141 -0
  173. package/packages/arcgis-rest-auth/README.md +71 -0
  174. package/packages/arcgis-rest-auth/package.json +69 -0
  175. package/packages/arcgis-rest-auth/post-message-auth-spec.md +70 -0
  176. package/packages/arcgis-rest-auth/src/ApiKey.ts +41 -0
  177. package/packages/arcgis-rest-auth/src/ApplicationSession.ts +122 -0
  178. package/packages/arcgis-rest-auth/src/UserSession.ts +1355 -0
  179. package/packages/arcgis-rest-auth/src/app-tokens.ts +131 -0
  180. package/packages/arcgis-rest-auth/src/authenticated-request-options.ts +24 -0
  181. package/packages/arcgis-rest-auth/src/federation-utils.ts +85 -0
  182. package/packages/arcgis-rest-auth/src/fetch-token.ts +50 -0
  183. package/packages/arcgis-rest-auth/src/generate-token.ts +35 -0
  184. package/packages/arcgis-rest-auth/src/index.ts +13 -0
  185. package/packages/arcgis-rest-auth/src/validate-app-access.ts +68 -0
  186. package/packages/arcgis-rest-auth/test/ApiKey.test.ts +35 -0
  187. package/packages/arcgis-rest-auth/test/ApplicationSession.test.ts +124 -0
  188. package/packages/arcgis-rest-auth/test/UserSession.test.ts +2377 -0
  189. package/packages/arcgis-rest-auth/test/app-tokens.test.ts +95 -0
  190. package/packages/arcgis-rest-auth/test/federation-utils.test.ts +323 -0
  191. package/packages/arcgis-rest-auth/test/fetchToken.test.ts +112 -0
  192. package/packages/arcgis-rest-auth/test/generateToken.test.ts +102 -0
  193. package/packages/arcgis-rest-auth/test/utils.ts +14 -0
  194. package/packages/arcgis-rest-auth/test/validate-app-access.test.ts +46 -0
  195. package/packages/arcgis-rest-auth/tsconfig.json +6 -0
  196. package/packages/arcgis-rest-demographics/README.md +75 -0
  197. package/packages/arcgis-rest-demographics/package.json +69 -0
  198. package/packages/arcgis-rest-demographics/src/getAvailableCountries.ts +113 -0
  199. package/packages/arcgis-rest-demographics/src/getAvailableDataCollections.ts +166 -0
  200. package/packages/arcgis-rest-demographics/src/getAvailableGeographyLevels.ts +88 -0
  201. package/packages/arcgis-rest-demographics/src/getGeography.ts +152 -0
  202. package/packages/arcgis-rest-demographics/src/helpers.ts +28 -0
  203. package/packages/arcgis-rest-demographics/src/index.ts +8 -0
  204. package/packages/arcgis-rest-demographics/src/queryDemographicData.ts +106 -0
  205. package/packages/arcgis-rest-demographics/test/getAvailableCountries.test.ts +92 -0
  206. package/packages/arcgis-rest-demographics/test/getAvailableDataCollections.test.ts +115 -0
  207. package/packages/arcgis-rest-demographics/test/getAvailableGeographyLevels.test.ts +72 -0
  208. package/packages/arcgis-rest-demographics/test/getGeography.test.ts +141 -0
  209. package/packages/arcgis-rest-demographics/test/mocks/responses.ts +4 -0
  210. package/packages/arcgis-rest-demographics/test/queryDemographicData.test.live.ts +42 -0
  211. package/packages/arcgis-rest-demographics/test/queryDemographicData.test.ts +113 -0
  212. package/packages/arcgis-rest-demographics/tsconfig.json +6 -0
  213. package/packages/arcgis-rest-feature-layer/README.md +77 -0
  214. package/packages/arcgis-rest-feature-layer/package.json +64 -0
  215. package/packages/arcgis-rest-feature-layer/src/add.ts +56 -0
  216. package/packages/arcgis-rest-feature-layer/src/addAttachment.ts +53 -0
  217. package/packages/arcgis-rest-feature-layer/src/applyEdits.ts +95 -0
  218. package/packages/arcgis-rest-feature-layer/src/decodeValues.ts +122 -0
  219. package/packages/arcgis-rest-feature-layer/src/delete.ts +61 -0
  220. package/packages/arcgis-rest-feature-layer/src/deleteAttachments.ts +52 -0
  221. package/packages/arcgis-rest-feature-layer/src/getAllLayersAndTables.ts +30 -0
  222. package/packages/arcgis-rest-feature-layer/src/getAttachments.ts +55 -0
  223. package/packages/arcgis-rest-feature-layer/src/getLayer.ts +24 -0
  224. package/packages/arcgis-rest-feature-layer/src/getService.ts +26 -0
  225. package/packages/arcgis-rest-feature-layer/src/helpers.ts +97 -0
  226. package/packages/arcgis-rest-feature-layer/src/index.ts +32 -0
  227. package/packages/arcgis-rest-feature-layer/src/query.ts +204 -0
  228. package/packages/arcgis-rest-feature-layer/src/queryRelated.ts +89 -0
  229. package/packages/arcgis-rest-feature-layer/src/update.ts +60 -0
  230. package/packages/arcgis-rest-feature-layer/src/updateAttachment.ts +59 -0
  231. package/packages/arcgis-rest-feature-layer/test/attachments.test.ts +200 -0
  232. package/packages/arcgis-rest-feature-layer/test/crud.test.ts +197 -0
  233. package/packages/arcgis-rest-feature-layer/test/decodeValues.test.ts +67 -0
  234. package/packages/arcgis-rest-feature-layer/test/getAllLayersAndTables.test.ts +28 -0
  235. package/packages/arcgis-rest-feature-layer/test/getLayer.test.ts +31 -0
  236. package/packages/arcgis-rest-feature-layer/test/getService.test.ts +31 -0
  237. package/packages/arcgis-rest-feature-layer/test/helpers.test.ts +25 -0
  238. package/packages/arcgis-rest-feature-layer/test/mocks/allLayersAndTablesResponse.ts +906 -0
  239. package/packages/arcgis-rest-feature-layer/test/mocks/cvdQueryResponse.ts +225 -0
  240. package/packages/arcgis-rest-feature-layer/test/mocks/feature.ts +302 -0
  241. package/packages/arcgis-rest-feature-layer/test/mocks/fields.ts +779 -0
  242. package/packages/arcgis-rest-feature-layer/test/mocks/foo.txt +1 -0
  243. package/packages/arcgis-rest-feature-layer/test/mocks/service.ts +398 -0
  244. package/packages/arcgis-rest-feature-layer/test/query.test.ts +167 -0
  245. package/packages/arcgis-rest-feature-layer/tsconfig.json +6 -0
  246. package/packages/arcgis-rest-geocoding/README.md +86 -0
  247. package/packages/arcgis-rest-geocoding/package.json +66 -0
  248. package/packages/arcgis-rest-geocoding/src/bulk.ts +104 -0
  249. package/packages/arcgis-rest-geocoding/src/geocode.ts +166 -0
  250. package/packages/arcgis-rest-geocoding/src/helpers.ts +56 -0
  251. package/packages/arcgis-rest-geocoding/src/index.ts +15 -0
  252. package/packages/arcgis-rest-geocoding/src/reverse.ts +84 -0
  253. package/packages/arcgis-rest-geocoding/src/suggest.ts +45 -0
  254. package/packages/arcgis-rest-geocoding/test/bulk.test.ts +194 -0
  255. package/packages/arcgis-rest-geocoding/test/geocode.test.ts +253 -0
  256. package/packages/arcgis-rest-geocoding/test/helpers.test.ts +85 -0
  257. package/packages/arcgis-rest-geocoding/test/mocks/responses.ts +591 -0
  258. package/packages/arcgis-rest-geocoding/test/reverse.test.ts +126 -0
  259. package/packages/arcgis-rest-geocoding/test/suggest.test.ts +53 -0
  260. package/packages/arcgis-rest-geocoding/tsconfig.json +6 -0
  261. package/packages/arcgis-rest-portal/README.md +73 -0
  262. package/packages/arcgis-rest-portal/package.json +64 -0
  263. package/packages/arcgis-rest-portal/src/groups/add-users.ts +140 -0
  264. package/packages/arcgis-rest-portal/src/groups/create.ts +43 -0
  265. package/packages/arcgis-rest-portal/src/groups/get.ts +184 -0
  266. package/packages/arcgis-rest-portal/src/groups/helpers.ts +14 -0
  267. package/packages/arcgis-rest-portal/src/groups/invite-users.ts +127 -0
  268. package/packages/arcgis-rest-portal/src/groups/join.ts +57 -0
  269. package/packages/arcgis-rest-portal/src/groups/notification.ts +77 -0
  270. package/packages/arcgis-rest-portal/src/groups/protect.ts +56 -0
  271. package/packages/arcgis-rest-portal/src/groups/remove-users.ts +76 -0
  272. package/packages/arcgis-rest-portal/src/groups/remove.ts +32 -0
  273. package/packages/arcgis-rest-portal/src/groups/search.ts +47 -0
  274. package/packages/arcgis-rest-portal/src/groups/update-user-membership.ts +63 -0
  275. package/packages/arcgis-rest-portal/src/groups/update.ts +39 -0
  276. package/packages/arcgis-rest-portal/src/index.ts +69 -0
  277. package/packages/arcgis-rest-portal/src/items/add.ts +138 -0
  278. package/packages/arcgis-rest-portal/src/items/content.ts +67 -0
  279. package/packages/arcgis-rest-portal/src/items/create.ts +150 -0
  280. package/packages/arcgis-rest-portal/src/items/export.ts +80 -0
  281. package/packages/arcgis-rest-portal/src/items/get.ts +437 -0
  282. package/packages/arcgis-rest-portal/src/items/helpers.ts +292 -0
  283. package/packages/arcgis-rest-portal/src/items/protect.ts +41 -0
  284. package/packages/arcgis-rest-portal/src/items/reassign.ts +61 -0
  285. package/packages/arcgis-rest-portal/src/items/remove.ts +141 -0
  286. package/packages/arcgis-rest-portal/src/items/search.ts +25 -0
  287. package/packages/arcgis-rest-portal/src/items/update.ts +185 -0
  288. package/packages/arcgis-rest-portal/src/items/upload.ts +125 -0
  289. package/packages/arcgis-rest-portal/src/orgs/notification.ts +131 -0
  290. package/packages/arcgis-rest-portal/src/services/get-unique-service-name.ts +35 -0
  291. package/packages/arcgis-rest-portal/src/services/is-service-name-available.ts +30 -0
  292. package/packages/arcgis-rest-portal/src/sharing/access.ts +84 -0
  293. package/packages/arcgis-rest-portal/src/sharing/helpers.ts +81 -0
  294. package/packages/arcgis-rest-portal/src/sharing/is-item-shared-with-group.ts +42 -0
  295. package/packages/arcgis-rest-portal/src/sharing/share-item-with-group.ts +336 -0
  296. package/packages/arcgis-rest-portal/src/sharing/unshare-item-with-group.ts +105 -0
  297. package/packages/arcgis-rest-portal/src/users/get-user-tags.ts +52 -0
  298. package/packages/arcgis-rest-portal/src/users/get-user-url.ts +18 -0
  299. package/packages/arcgis-rest-portal/src/users/get-user.ts +58 -0
  300. package/packages/arcgis-rest-portal/src/users/invitation.ts +156 -0
  301. package/packages/arcgis-rest-portal/src/users/notification.ts +68 -0
  302. package/packages/arcgis-rest-portal/src/users/search-users.ts +37 -0
  303. package/packages/arcgis-rest-portal/src/users/update.ts +66 -0
  304. package/packages/arcgis-rest-portal/src/util/SearchQueryBuilder.ts +391 -0
  305. package/packages/arcgis-rest-portal/src/util/array.ts +16 -0
  306. package/packages/arcgis-rest-portal/src/util/generic-search.ts +99 -0
  307. package/packages/arcgis-rest-portal/src/util/get-portal-settings.ts +45 -0
  308. package/packages/arcgis-rest-portal/src/util/get-portal-url.ts +28 -0
  309. package/packages/arcgis-rest-portal/src/util/get-portal.ts +53 -0
  310. package/packages/arcgis-rest-portal/src/util/get-subscription-info.ts +43 -0
  311. package/packages/arcgis-rest-portal/src/util/scrub-control-chars.ts +13 -0
  312. package/packages/arcgis-rest-portal/src/util/search.ts +42 -0
  313. package/packages/arcgis-rest-portal/test/groups/add-users.test.ts +239 -0
  314. package/packages/arcgis-rest-portal/test/groups/crud.test.ts +180 -0
  315. package/packages/arcgis-rest-portal/test/groups/get.test.ts +176 -0
  316. package/packages/arcgis-rest-portal/test/groups/invite-users.test.ts +146 -0
  317. package/packages/arcgis-rest-portal/test/groups/join.test.ts +72 -0
  318. package/packages/arcgis-rest-portal/test/groups/notification.test.ts +112 -0
  319. package/packages/arcgis-rest-portal/test/groups/protect.test.ts +72 -0
  320. package/packages/arcgis-rest-portal/test/groups/remove-users.test.ts +140 -0
  321. package/packages/arcgis-rest-portal/test/groups/search.test.ts +151 -0
  322. package/packages/arcgis-rest-portal/test/groups/update-user-membership.test.ts +62 -0
  323. package/packages/arcgis-rest-portal/test/items/add.test.ts +323 -0
  324. package/packages/arcgis-rest-portal/test/items/content.test.ts +156 -0
  325. package/packages/arcgis-rest-portal/test/items/create.test.ts +400 -0
  326. package/packages/arcgis-rest-portal/test/items/export.test.ts +122 -0
  327. package/packages/arcgis-rest-portal/test/items/get.test.ts +583 -0
  328. package/packages/arcgis-rest-portal/test/items/helpers.test.ts +60 -0
  329. package/packages/arcgis-rest-portal/test/items/protect.test.ts +122 -0
  330. package/packages/arcgis-rest-portal/test/items/reassign.test.ts +131 -0
  331. package/packages/arcgis-rest-portal/test/items/remove.test.ts +261 -0
  332. package/packages/arcgis-rest-portal/test/items/search.test.ts +275 -0
  333. package/packages/arcgis-rest-portal/test/items/update.test.ts +556 -0
  334. package/packages/arcgis-rest-portal/test/items/upload.test.ts +282 -0
  335. package/packages/arcgis-rest-portal/test/mocks/groups/responses.ts +208 -0
  336. package/packages/arcgis-rest-portal/test/mocks/items/foo.zip +0 -0
  337. package/packages/arcgis-rest-portal/test/mocks/items/item.ts +526 -0
  338. package/packages/arcgis-rest-portal/test/mocks/items/resources.ts +38 -0
  339. package/packages/arcgis-rest-portal/test/mocks/items/search.ts +121 -0
  340. package/packages/arcgis-rest-portal/test/mocks/portal/response.ts +126 -0
  341. package/packages/arcgis-rest-portal/test/mocks/portal/settings-response.ts +56 -0
  342. package/packages/arcgis-rest-portal/test/mocks/sharing/sharing.ts +18 -0
  343. package/packages/arcgis-rest-portal/test/mocks/users/invitation.ts +70 -0
  344. package/packages/arcgis-rest-portal/test/mocks/users/notification.ts +34 -0
  345. package/packages/arcgis-rest-portal/test/mocks/users/user-search.ts +388 -0
  346. package/packages/arcgis-rest-portal/test/mocks/users/user-tags.ts +5 -0
  347. package/packages/arcgis-rest-portal/test/mocks/users/user.ts +174 -0
  348. package/packages/arcgis-rest-portal/test/orgs/notification.test.ts +144 -0
  349. package/packages/arcgis-rest-portal/test/services/get-unique-service-name.test.ts +59 -0
  350. package/packages/arcgis-rest-portal/test/services/is-service-name-available.test.ts +46 -0
  351. package/packages/arcgis-rest-portal/test/sharing/access.test.ts +162 -0
  352. package/packages/arcgis-rest-portal/test/sharing/helpers.test.ts +55 -0
  353. package/packages/arcgis-rest-portal/test/sharing/share-item-with-group.test.ts +1328 -0
  354. package/packages/arcgis-rest-portal/test/sharing/unshare-item-with-group.test.ts +288 -0
  355. package/packages/arcgis-rest-portal/test/users/get-user-tags.test.ts +71 -0
  356. package/packages/arcgis-rest-portal/test/users/get-user-url.test.ts +40 -0
  357. package/packages/arcgis-rest-portal/test/users/get-user.test.ts +90 -0
  358. package/packages/arcgis-rest-portal/test/users/invitation.test.ts +127 -0
  359. package/packages/arcgis-rest-portal/test/users/notification.test.ts +77 -0
  360. package/packages/arcgis-rest-portal/test/users/search.test.ts +42 -0
  361. package/packages/arcgis-rest-portal/test/users/update.test.ts +151 -0
  362. package/packages/arcgis-rest-portal/test/util/SearchQueryBuilder.test.ts +340 -0
  363. package/packages/arcgis-rest-portal/test/util/array.test.ts +30 -0
  364. package/packages/arcgis-rest-portal/test/util/get-portal-settings.test.ts +68 -0
  365. package/packages/arcgis-rest-portal/test/util/get-portal-url.test.ts +37 -0
  366. package/packages/arcgis-rest-portal/test/util/portal.test.ts +148 -0
  367. package/packages/arcgis-rest-portal/test/util/scrub-control-chars.test.ts +22 -0
  368. package/packages/arcgis-rest-portal/tsconfig.json +6 -0
  369. package/packages/arcgis-rest-request/README.md +72 -0
  370. package/packages/arcgis-rest-request/package.json +60 -0
  371. package/packages/arcgis-rest-request/src/index.ts +25 -0
  372. package/packages/arcgis-rest-request/src/request.ts +433 -0
  373. package/packages/arcgis-rest-request/src/utils/ArcGISRequestError.ts +76 -0
  374. package/packages/arcgis-rest-request/src/utils/ErrorTypes.ts +29 -0
  375. package/packages/arcgis-rest-request/src/utils/GrantTypes.ts +5 -0
  376. package/packages/arcgis-rest-request/src/utils/HTTPMethods.ts +6 -0
  377. package/packages/arcgis-rest-request/src/utils/IAuthenticationManager.ts +22 -0
  378. package/packages/arcgis-rest-request/src/utils/IFetchTokenParams.ts +11 -0
  379. package/packages/arcgis-rest-request/src/utils/IGenerateTokenParams.ts +9 -0
  380. package/packages/arcgis-rest-request/src/utils/IParamBuilder.ts +3 -0
  381. package/packages/arcgis-rest-request/src/utils/IParams.ts +6 -0
  382. package/packages/arcgis-rest-request/src/utils/IParamsBuilder.ts +5 -0
  383. package/packages/arcgis-rest-request/src/utils/IRequestOptions.ts +54 -0
  384. package/packages/arcgis-rest-request/src/utils/ITokenRequestOptions.ts +9 -0
  385. package/packages/arcgis-rest-request/src/utils/ResponseFormats.ts +10 -0
  386. package/packages/arcgis-rest-request/src/utils/append-custom-params.ts +49 -0
  387. package/packages/arcgis-rest-request/src/utils/clean-url.ts +20 -0
  388. package/packages/arcgis-rest-request/src/utils/decode-query-string.ts +27 -0
  389. package/packages/arcgis-rest-request/src/utils/encode-form-data.ts +38 -0
  390. package/packages/arcgis-rest-request/src/utils/encode-query-string.ts +35 -0
  391. package/packages/arcgis-rest-request/src/utils/process-params.ts +109 -0
  392. package/packages/arcgis-rest-request/src/utils/retryAuthError.ts +10 -0
  393. package/packages/arcgis-rest-request/src/utils/warn.ts +11 -0
  394. package/packages/arcgis-rest-request/src/utils/with-options.ts +48 -0
  395. package/packages/arcgis-rest-request/test/mocks/errors.ts +76 -0
  396. package/packages/arcgis-rest-request/test/mocks/geojson-feature-collection.ts +13 -0
  397. package/packages/arcgis-rest-request/test/mocks/param-builder.ts +7 -0
  398. package/packages/arcgis-rest-request/test/mocks/sharing-rest-info.ts +41 -0
  399. package/packages/arcgis-rest-request/test/mocks/webmap.ts +41 -0
  400. package/packages/arcgis-rest-request/test/request.test.ts +621 -0
  401. package/packages/arcgis-rest-request/test/utils/ArcGISAuthError.test.ts +191 -0
  402. package/packages/arcgis-rest-request/test/utils/ArcGISRequestError.test.ts +51 -0
  403. package/packages/arcgis-rest-request/test/utils/check-for-errors.test.ts +111 -0
  404. package/packages/arcgis-rest-request/test/utils/clean-url.test.ts +50 -0
  405. package/packages/arcgis-rest-request/test/utils/encode-form-data.test.ts +133 -0
  406. package/packages/arcgis-rest-request/test/utils/encode-query-string.test.ts +18 -0
  407. package/packages/arcgis-rest-request/test/utils/process-params.test.ts +205 -0
  408. package/packages/arcgis-rest-request/test/utils/with-options.test.ts +133 -0
  409. package/packages/arcgis-rest-request/tsconfig.json +4 -0
  410. package/packages/arcgis-rest-routing/README.md +75 -0
  411. package/packages/arcgis-rest-routing/package.json +65 -0
  412. package/packages/arcgis-rest-routing/src/closestFacility.ts +225 -0
  413. package/packages/arcgis-rest-routing/src/helpers.ts +104 -0
  414. package/packages/arcgis-rest-routing/src/index.ts +14 -0
  415. package/packages/arcgis-rest-routing/src/originDestinationMatrix.ts +223 -0
  416. package/packages/arcgis-rest-routing/src/serviceArea.ts +173 -0
  417. package/packages/arcgis-rest-routing/src/solveRoute.ts +180 -0
  418. package/packages/arcgis-rest-routing/test/closestFacility.test.ts +683 -0
  419. package/packages/arcgis-rest-routing/test/mocks/inputs.ts +132 -0
  420. package/packages/arcgis-rest-routing/test/mocks/responses.ts +13316 -0
  421. package/packages/arcgis-rest-routing/test/originDestinationMatrix.test.ts +795 -0
  422. package/packages/arcgis-rest-routing/test/serviceArea.test.ts +601 -0
  423. package/packages/arcgis-rest-routing/test/solveRoute.test.ts +677 -0
  424. package/packages/arcgis-rest-routing/tsconfig.json +6 -0
  425. package/packages/arcgis-rest-service-admin/README.md +73 -0
  426. package/packages/arcgis-rest-service-admin/package.json +65 -0
  427. package/packages/arcgis-rest-service-admin/src/addTo.ts +70 -0
  428. package/packages/arcgis-rest-service-admin/src/create.ts +189 -0
  429. package/packages/arcgis-rest-service-admin/src/get-service-admin-info.ts +34 -0
  430. package/packages/arcgis-rest-service-admin/src/get-view-sources.ts +20 -0
  431. package/packages/arcgis-rest-service-admin/src/index.ts +14 -0
  432. package/packages/arcgis-rest-service-admin/src/update.ts +50 -0
  433. package/packages/arcgis-rest-service-admin/test/addTo.test.ts +350 -0
  434. package/packages/arcgis-rest-service-admin/test/create.test.ts +294 -0
  435. package/packages/arcgis-rest-service-admin/test/get-service-admin-info.test.ts +37 -0
  436. package/packages/arcgis-rest-service-admin/test/get-view-sources.test.ts +40 -0
  437. package/packages/arcgis-rest-service-admin/test/mocks/layerDefinition.ts +79 -0
  438. package/packages/arcgis-rest-service-admin/test/mocks/service.ts +81 -0
  439. package/packages/arcgis-rest-service-admin/test/update.test.ts +115 -0
  440. package/packages/arcgis-rest-service-admin/tsconfig.json +5 -0
  441. package/packages/arcgis-rest-types/README.md +66 -0
  442. package/packages/arcgis-rest-types/package.json +54 -0
  443. package/packages/arcgis-rest-types/src/feature.ts +42 -0
  444. package/packages/arcgis-rest-types/src/geometry.ts +272 -0
  445. package/packages/arcgis-rest-types/src/group.ts +72 -0
  446. package/packages/arcgis-rest-types/src/index.ts +9 -0
  447. package/packages/arcgis-rest-types/src/item.ts +81 -0
  448. package/packages/arcgis-rest-types/src/service.ts +156 -0
  449. package/packages/arcgis-rest-types/src/statisticDefinition.ts +33 -0
  450. package/packages/arcgis-rest-types/src/symbol.ts +170 -0
  451. package/packages/arcgis-rest-types/src/user.ts +49 -0
  452. package/packages/arcgis-rest-types/src/webmap.ts +1405 -0
  453. package/packages/arcgis-rest-types/tsconfig.json +10 -0
  454. package/support/changelog.js +393 -0
  455. package/support/deploy-doc-site.js +16 -0
  456. package/support/dev.sh +6 -0
  457. package/support/publish.sh +47 -0
  458. package/support/test-helpers.js +9 -0
  459. package/tsconfig.json +63 -0
  460. package/umd-base-profile.js +81 -0
  461. package/umd-production-profile.js +13 -0
@@ -0,0 +1,1328 @@
1
+ /* Copyright (c) 2018 Environmental Systems Research Institute, Inc.
2
+ * Apache-2.0 */
3
+
4
+ import * as fetchMock from "fetch-mock";
5
+ import {
6
+ shareItemWithGroup,
7
+ ensureMembership,
8
+ } from "../../src/sharing/share-item-with-group";
9
+ import { MOCK_USER_SESSION } from "../mocks/sharing/sharing";
10
+ import { TOMORROW } from "@esri/arcgis-rest-auth/test/utils";
11
+ import { ArcGISAuthError } from "@esri/arcgis-rest-request";
12
+
13
+ import {
14
+ GroupNonMemberUserResponse,
15
+ GroupMemberUserResponse,
16
+ GroupAdminUserResponse,
17
+ OrgAdminUserResponse,
18
+ AnonUserResponse,
19
+ } from "../mocks/users/user";
20
+
21
+ import { SearchResponse } from "../mocks/items/search";
22
+ import { ISharingResponse } from "../../src/sharing/helpers";
23
+
24
+ const SharingResponse = {
25
+ notSharedWith: [] as any,
26
+ itemId: "n3v",
27
+ };
28
+
29
+ const FailedSharingResponse = {
30
+ notSharedWith: ["t6b"],
31
+ itemId: "n3v",
32
+ };
33
+
34
+ const CachedSharingResponse = {
35
+ notSharedWith: [] as any,
36
+ itemId: "a5b",
37
+ shortcut: true,
38
+ };
39
+
40
+ const NoResultsSearchResponse = {
41
+ query: "",
42
+ total: 0,
43
+ start: 0,
44
+ num: 0,
45
+ nextStart: 0,
46
+ results: [] as any,
47
+ };
48
+
49
+ export const GroupOwnerResponse = {
50
+ id: "tb6",
51
+ title: "fake group",
52
+ userMembership: {
53
+ memberType: "owner",
54
+ },
55
+ };
56
+
57
+ export const GroupMemberResponse = {
58
+ id: "tb6",
59
+ title: "fake group",
60
+ userMembership: {
61
+ memberType: "member",
62
+ },
63
+ };
64
+
65
+ export const GroupNonMemberResponse = {
66
+ id: "tb6",
67
+ title: "fake group",
68
+ userMembership: {
69
+ memberType: "none",
70
+ },
71
+ };
72
+
73
+ export const GroupAdminResponse = {
74
+ id: "tb6",
75
+ title: "fake group",
76
+ userMembership: {
77
+ memberType: "admin",
78
+ },
79
+ };
80
+
81
+ export const GroupNoAccessResponse = {
82
+ error: {
83
+ code: 400,
84
+ messageCode: "COM_0003",
85
+ message: "Group does not exist or is inaccessible.",
86
+ details: [] as any[],
87
+ },
88
+ };
89
+
90
+ describe("shareItemWithGroup() ::", () => {
91
+ // make sure session doesnt cache metadata
92
+ beforeEach((done) => {
93
+ fetchMock.post("https://myorg.maps.arcgis.com/sharing/rest/generateToken", {
94
+ token: "fake-token",
95
+ expires: TOMORROW.getTime(),
96
+ username: "jsmith",
97
+ });
98
+
99
+ // make sure session doesnt cache metadata
100
+ MOCK_USER_SESSION.refreshSession()
101
+ .then(() => done())
102
+ .catch();
103
+ });
104
+
105
+ afterEach(fetchMock.restore);
106
+ describe("share item as owner::", () => {
107
+ it("should share an item with a group by owner", (done) => {
108
+ // this is called when we try to determine if the item is already in the group
109
+ fetchMock.once(
110
+ "https://myorg.maps.arcgis.com/sharing/rest/search",
111
+ SearchResponse
112
+ );
113
+
114
+ // the actual sharing request
115
+ fetchMock.once(
116
+ "https://myorg.maps.arcgis.com/sharing/rest/content/users/jsmith/items/n3v/share",
117
+ SharingResponse
118
+ );
119
+
120
+ shareItemWithGroup({
121
+ authentication: MOCK_USER_SESSION,
122
+ id: "n3v",
123
+ groupId: "t6b",
124
+ })
125
+ .then((response) => {
126
+ expect(fetchMock.done()).toBeTruthy(
127
+ "All fetchMocks should have been called"
128
+ );
129
+ const [url, options]: [string, RequestInit] = fetchMock.lastCall(
130
+ "https://myorg.maps.arcgis.com/sharing/rest/content/users/jsmith/items/n3v/share"
131
+ );
132
+ expect(url).toBe(
133
+ "https://myorg.maps.arcgis.com/sharing/rest/content/users/jsmith/items/n3v/share"
134
+ );
135
+ expect(options.method).toBe("POST");
136
+ expect(response).toEqual(SharingResponse);
137
+ expect(options.body).toContain("f=json");
138
+ expect(options.body).toContain("groups=t6b");
139
+ done();
140
+ })
141
+ .catch((e) => {
142
+ expect(fetchMock.done()).toBeTruthy(
143
+ "All fetchMocks should have been called"
144
+ );
145
+ fail(e);
146
+ });
147
+ });
148
+
149
+ it("should share an item with a group by org administrator", (done) => {
150
+ fetchMock.once(
151
+ "https://myorg.maps.arcgis.com/sharing/rest/community/users/jsmith?f=json&token=fake-token",
152
+ OrgAdminUserResponse
153
+ );
154
+
155
+ fetchMock.once(
156
+ "https://myorg.maps.arcgis.com/sharing/rest/community/users/casey?f=json&token=fake-token",
157
+ {
158
+ username: "casey",
159
+ orgId: "qWAReEOCnD7eTxOe",
160
+ groups: [] as any[],
161
+ }
162
+ );
163
+
164
+ fetchMock.once(
165
+ "https://myorg.maps.arcgis.com/sharing/rest/search",
166
+ NoResultsSearchResponse
167
+ );
168
+
169
+ // called when we determine if the user is a member of the group
170
+ fetchMock.get(
171
+ "https://myorg.maps.arcgis.com/sharing/rest/community/groups/t6b?f=json&token=fake-token",
172
+ GroupOwnerResponse
173
+ );
174
+
175
+ fetchMock.once(
176
+ "https://myorg.maps.arcgis.com/sharing/rest/content/users/casey/items/n3v/share",
177
+ SharingResponse
178
+ );
179
+ shareItemWithGroup({
180
+ authentication: MOCK_USER_SESSION,
181
+ id: "n3v",
182
+ groupId: "t6b",
183
+ owner: "casey",
184
+ })
185
+ .then((response) => {
186
+ expect(fetchMock.done()).toBeTruthy(
187
+ "All fetchMocks should have been called"
188
+ );
189
+ const [url, options]: [string, RequestInit] = fetchMock.lastCall(
190
+ "https://myorg.maps.arcgis.com/sharing/rest/content/users/casey/items/n3v/share"
191
+ );
192
+ expect(url).toBe(
193
+ "https://myorg.maps.arcgis.com/sharing/rest/content/users/casey/items/n3v/share"
194
+ );
195
+ expect(options.method).toBe("POST");
196
+ expect(response).toEqual(SharingResponse);
197
+ expect(options.body).toContain("f=json");
198
+ expect(options.body).toContain("groups=t6b");
199
+ done();
200
+ })
201
+ .catch((e) => {
202
+ fail(e);
203
+ });
204
+ });
205
+
206
+ it("should share an item with a group by group owner/admin", (done) => {
207
+ fetchMock.once(
208
+ "https://myorg.maps.arcgis.com/sharing/rest/community/users/jsmith?f=json&token=fake-token",
209
+ GroupAdminUserResponse
210
+ );
211
+
212
+ fetchMock.once(
213
+ "https://myorg.maps.arcgis.com/sharing/rest/community/users/otherguy?f=json&token=fake-token",
214
+ {
215
+ username: "otherguy",
216
+ orgId: "qWAReEOCnD7eTxOe",
217
+ groups: [] as any[],
218
+ }
219
+ );
220
+
221
+ fetchMock.once(
222
+ "https://myorg.maps.arcgis.com/sharing/rest/search",
223
+ SearchResponse
224
+ );
225
+
226
+ // called when we determine if the user is a member of the group
227
+ fetchMock.get(
228
+ "https://myorg.maps.arcgis.com/sharing/rest/community/groups/t6b?f=json&token=fake-token",
229
+ GroupOwnerResponse
230
+ );
231
+
232
+ fetchMock.once(
233
+ "https://myorg.maps.arcgis.com/sharing/rest/content/items/n3v/share",
234
+ SharingResponse
235
+ );
236
+
237
+ shareItemWithGroup({
238
+ authentication: MOCK_USER_SESSION,
239
+ id: "n3v",
240
+ groupId: "t6b",
241
+ owner: "otherguy",
242
+ })
243
+ .then((response) => {
244
+ expect(fetchMock.done()).toBeTruthy(
245
+ "All fetchMocks should have been called"
246
+ );
247
+ const [url, options]: [string, RequestInit] = fetchMock.lastCall(
248
+ "https://myorg.maps.arcgis.com/sharing/rest/content/items/n3v/share"
249
+ );
250
+ expect(url).toBe(
251
+ "https://myorg.maps.arcgis.com/sharing/rest/content/items/n3v/share"
252
+ );
253
+ expect(options.method).toBe("POST");
254
+ expect(response).toEqual(SharingResponse);
255
+ expect(options.body).toContain("f=json");
256
+ expect(options.body).toContain("groups=t6b");
257
+ done();
258
+ })
259
+ .catch((e) => {
260
+ expect(fetchMock.done()).toBeTruthy(
261
+ "All fetchMocks should have been called"
262
+ );
263
+ fail(e);
264
+ });
265
+ });
266
+
267
+ it("should mock the response if an item was previously shared with a group", (done) => {
268
+ fetchMock.once(
269
+ "https://myorg.maps.arcgis.com/sharing/rest/community/users/jsmith?f=json&token=fake-token",
270
+ GroupAdminUserResponse
271
+ );
272
+
273
+ fetchMock.once(
274
+ "https://myorg.maps.arcgis.com/sharing/rest/search",
275
+ SearchResponse
276
+ );
277
+
278
+ shareItemWithGroup({
279
+ authentication: MOCK_USER_SESSION,
280
+ id: "a5b",
281
+ groupId: "t6b",
282
+ })
283
+ .then((response) => {
284
+ // no web request to share at all
285
+ expect(response).toEqual(CachedSharingResponse);
286
+ done();
287
+ })
288
+ .catch((e) => {
289
+ expect(fetchMock.done()).toBeTruthy(
290
+ "All fetchMocks should have been called"
291
+ );
292
+ fail(e);
293
+ });
294
+ });
295
+
296
+ it("should allow group owner/admin/member to share item they do not own", (done) => {
297
+ fetchMock.once(
298
+ "https://myorg.maps.arcgis.com/sharing/rest/community/users/jsmith?f=json&token=fake-token",
299
+ GroupMemberUserResponse
300
+ );
301
+
302
+ fetchMock.once(
303
+ "https://myorg.maps.arcgis.com/sharing/rest/community/users/casey?f=json&token=fake-token",
304
+ {
305
+ username: "casey",
306
+ orgId: "qWAReEOCnD7eTxOe",
307
+ groups: [] as any[],
308
+ }
309
+ );
310
+
311
+ fetchMock.once(
312
+ "https://myorg.maps.arcgis.com/sharing/rest/search",
313
+ SearchResponse
314
+ );
315
+
316
+ // called when we determine if the user is a member of the group
317
+ fetchMock.get(
318
+ "https://myorg.maps.arcgis.com/sharing/rest/community/groups/t6b?f=json&token=fake-token",
319
+ GroupMemberResponse
320
+ );
321
+
322
+ fetchMock.once(
323
+ "https://myorg.maps.arcgis.com/sharing/rest/content/items/n3v/share",
324
+ SharingResponse
325
+ );
326
+
327
+ shareItemWithGroup({
328
+ authentication: MOCK_USER_SESSION,
329
+ id: "n3v",
330
+ groupId: "t6b",
331
+ owner: "casey",
332
+ })
333
+ .then((response) => {
334
+ expect(fetchMock.done()).toBeTruthy(
335
+ "All fetchMocks should have been called"
336
+ );
337
+ const [url, options]: [string, RequestInit] = fetchMock.lastCall(
338
+ "https://myorg.maps.arcgis.com/sharing/rest/content/items/n3v/share"
339
+ );
340
+ expect(url).toBe(
341
+ "https://myorg.maps.arcgis.com/sharing/rest/content/items/n3v/share"
342
+ );
343
+ expect(options.method).toBe("POST");
344
+ expect(response).toEqual(SharingResponse);
345
+ expect(options.body).toContain("f=json");
346
+ expect(options.body).toContain("groups=t6b");
347
+ done();
348
+ })
349
+ .catch((e) => {
350
+ fail(e);
351
+ });
352
+ });
353
+
354
+ it("should throw if non-owner tries to share to shared editing group", (done) => {
355
+ fetchMock.once(
356
+ "https://myorg.maps.arcgis.com/sharing/rest/community/users/jsmith?f=json&token=fake-token",
357
+ GroupMemberUserResponse
358
+ );
359
+
360
+ fetchMock.once(
361
+ "https://myorg.maps.arcgis.com/sharing/rest/community/users/casey?f=json&token=fake-token",
362
+ {
363
+ username: "casey",
364
+ orgId: "qWAReEOCnD7eTxOe",
365
+ groups: [] as any[],
366
+ }
367
+ );
368
+
369
+ fetchMock.once(
370
+ "https://myorg.maps.arcgis.com/sharing/rest/search",
371
+ SearchResponse
372
+ );
373
+
374
+ // called when we determine if the user is a member of the group
375
+ fetchMock.get(
376
+ "https://myorg.maps.arcgis.com/sharing/rest/community/groups/t6b?f=json&token=fake-token",
377
+ GroupMemberResponse
378
+ );
379
+
380
+ shareItemWithGroup({
381
+ authentication: MOCK_USER_SESSION,
382
+ id: "n3v",
383
+ groupId: "t6b",
384
+ owner: "casey",
385
+ confirmItemControl: true,
386
+ }).catch((e) => {
387
+ expect(fetchMock.done()).toBeTruthy(
388
+ "All fetchMocks should have been called"
389
+ );
390
+ expect(e.message).toContain(
391
+ "This item can not be shared to shared editing group t6b by jsmith as they not the item owner or org admin."
392
+ );
393
+ done();
394
+ });
395
+ });
396
+
397
+ it("should throw if the response from the server is fishy", (done) => {
398
+ fetchMock.once(
399
+ "https://myorg.maps.arcgis.com/sharing/rest/search",
400
+ SearchResponse
401
+ );
402
+
403
+ fetchMock.once(
404
+ "https://myorg.maps.arcgis.com/sharing/rest/content/users/jsmith/items/n3v/share",
405
+ FailedSharingResponse
406
+ );
407
+
408
+ shareItemWithGroup({
409
+ authentication: MOCK_USER_SESSION,
410
+ id: "n3v",
411
+ groupId: "t6b",
412
+ }).catch((e) => {
413
+ expect(fetchMock.done()).toBeTruthy(
414
+ "All fetchMocks should have been called"
415
+ );
416
+ expect(e.message).toBe("Item n3v could not be shared to group t6b.");
417
+ done();
418
+ });
419
+ });
420
+ });
421
+
422
+ describe("share item as org admin on behalf of other user ::", () => {
423
+ it("should add user to group then share item", (done) => {
424
+ fetchMock
425
+ .once(
426
+ "https://myorg.maps.arcgis.com/sharing/rest/community/users/jsmith?f=json&token=fake-token",
427
+ OrgAdminUserResponse
428
+ )
429
+ .once(
430
+ "https://myorg.maps.arcgis.com/sharing/rest/search",
431
+ NoResultsSearchResponse
432
+ )
433
+ .get(
434
+ "https://myorg.maps.arcgis.com/sharing/rest/community/groups/t6b?f=json&token=fake-token",
435
+ GroupOwnerResponse
436
+ )
437
+ .once(
438
+ "https://myorg.maps.arcgis.com/sharing/rest/community/users/casey?f=json&token=fake-token",
439
+ {
440
+ username: "casey",
441
+ orgId: "qWAReEOCnD7eTxOe",
442
+ groups: [] as any[],
443
+ }
444
+ )
445
+ .post(
446
+ "https://myorg.maps.arcgis.com/sharing/rest/community/groups/t6b/addUsers",
447
+ { notAdded: [] }
448
+ )
449
+ .post(
450
+ "https://myorg.maps.arcgis.com/sharing/rest/content/users/casey/items/n3v/share",
451
+ { notSharedWith: [], itemId: "n3v" }
452
+ );
453
+
454
+ shareItemWithGroup({
455
+ authentication: MOCK_USER_SESSION,
456
+ id: "n3v",
457
+ groupId: "t6b",
458
+ owner: "casey",
459
+ confirmItemControl: true,
460
+ })
461
+ .then((result) => {
462
+ expect(fetchMock.done()).toBeTruthy(
463
+ "All fetchMocks should have been called"
464
+ );
465
+ // verify we added casey to t6b
466
+ const addUsersOptions: RequestInit = fetchMock.lastOptions(
467
+ "https://myorg.maps.arcgis.com/sharing/rest/community/groups/t6b/addUsers"
468
+ );
469
+ expect(addUsersOptions.body).toContain("admins=casey");
470
+ // verify we shared the item
471
+ const shareOptions: RequestInit = fetchMock.lastOptions(
472
+ "https://myorg.maps.arcgis.com/sharing/rest/content/users/casey/items/n3v/share"
473
+ );
474
+ expect(shareOptions.body).toContain("groups=t6b");
475
+ expect(shareOptions.body).toContain("confirmItemControl=true");
476
+
477
+ done();
478
+ })
479
+ .catch((e) => {
480
+ fail();
481
+ });
482
+ });
483
+ it("should add user to group the returned user lacks groups array", (done) => {
484
+ // tbh, not 100% sure this can even happen, but... 100% coverage
485
+ fetchMock
486
+ .once(
487
+ "https://myorg.maps.arcgis.com/sharing/rest/community/users/jsmith?f=json&token=fake-token",
488
+ OrgAdminUserResponse
489
+ )
490
+ .once(
491
+ "https://myorg.maps.arcgis.com/sharing/rest/search",
492
+ NoResultsSearchResponse
493
+ )
494
+ .get(
495
+ "https://myorg.maps.arcgis.com/sharing/rest/community/groups/t6b?f=json&token=fake-token",
496
+ GroupOwnerResponse
497
+ )
498
+ .once(
499
+ "https://myorg.maps.arcgis.com/sharing/rest/community/users/casey?f=json&token=fake-token",
500
+ {
501
+ username: "casey",
502
+ orgId: "qWAReEOCnD7eTxOe",
503
+ }
504
+ )
505
+ .post(
506
+ "https://myorg.maps.arcgis.com/sharing/rest/community/groups/t6b/addUsers",
507
+ { notAdded: [] }
508
+ )
509
+ .post(
510
+ "https://myorg.maps.arcgis.com/sharing/rest/content/users/casey/items/n3v/share",
511
+ { notSharedWith: [], itemId: "n3v" }
512
+ );
513
+
514
+ shareItemWithGroup({
515
+ authentication: MOCK_USER_SESSION,
516
+ id: "n3v",
517
+ groupId: "t6b",
518
+ owner: "casey",
519
+ confirmItemControl: true,
520
+ })
521
+ .then((result) => {
522
+ expect(fetchMock.done()).toBeTruthy(
523
+ "All fetchMocks should have been called"
524
+ );
525
+ // verify we added casey to t6b
526
+ const addUsersOptions: RequestInit = fetchMock.lastOptions(
527
+ "https://myorg.maps.arcgis.com/sharing/rest/community/groups/t6b/addUsers"
528
+ );
529
+ expect(addUsersOptions.body).toContain("admins=casey");
530
+ // verify we shared the item
531
+ const shareOptions: RequestInit = fetchMock.lastOptions(
532
+ "https://myorg.maps.arcgis.com/sharing/rest/content/users/casey/items/n3v/share"
533
+ );
534
+ expect(shareOptions.body).toContain("groups=t6b");
535
+ expect(shareOptions.body).toContain("confirmItemControl=true");
536
+
537
+ done();
538
+ })
539
+ .catch((e) => {
540
+ fail();
541
+ });
542
+ });
543
+ it("should upgrade user to admin then share item", (done) => {
544
+ fetchMock
545
+ .once(
546
+ "https://myorg.maps.arcgis.com/sharing/rest/community/users/jsmith?f=json&token=fake-token",
547
+ OrgAdminUserResponse
548
+ )
549
+ .once(
550
+ "https://myorg.maps.arcgis.com/sharing/rest/search",
551
+ NoResultsSearchResponse
552
+ )
553
+ .get(
554
+ "https://myorg.maps.arcgis.com/sharing/rest/community/groups/t6b?f=json&token=fake-token",
555
+ GroupOwnerResponse
556
+ )
557
+ .once(
558
+ "https://myorg.maps.arcgis.com/sharing/rest/community/users/casey?f=json&token=fake-token",
559
+ {
560
+ username: "casey",
561
+ orgId: "qWAReEOCnD7eTxOe",
562
+ groups: [
563
+ {
564
+ id: "t6b",
565
+ userMembership: {
566
+ memberType: "member",
567
+ },
568
+ },
569
+ ] as any[],
570
+ }
571
+ )
572
+ .post(
573
+ "https://myorg.maps.arcgis.com/sharing/rest/community/groups/t6b/updateUsers",
574
+ { results: [{ username: "casey", success: true }] }
575
+ )
576
+ .post(
577
+ "https://myorg.maps.arcgis.com/sharing/rest/content/users/casey/items/n3v/share",
578
+ { notSharedWith: [], itemId: "n3v" }
579
+ );
580
+
581
+ shareItemWithGroup({
582
+ authentication: MOCK_USER_SESSION,
583
+ id: "n3v",
584
+ groupId: "t6b",
585
+ owner: "casey",
586
+ confirmItemControl: true,
587
+ })
588
+ .then((result) => {
589
+ expect(fetchMock.done()).toBeTruthy(
590
+ "All fetchMocks should have been called"
591
+ );
592
+ // verify we added casey to t6b
593
+ const addUsersOptions: RequestInit = fetchMock.lastOptions(
594
+ "https://myorg.maps.arcgis.com/sharing/rest/community/groups/t6b/updateUsers"
595
+ );
596
+ expect(addUsersOptions.body).toContain("admins=casey");
597
+ // verify we shared the item
598
+ const shareOptions: RequestInit = fetchMock.lastOptions(
599
+ "https://myorg.maps.arcgis.com/sharing/rest/content/users/casey/items/n3v/share"
600
+ );
601
+ expect(shareOptions.body).toContain("groups=t6b");
602
+ expect(shareOptions.body).toContain("confirmItemControl=true");
603
+
604
+ done();
605
+ })
606
+ .catch((e) => {
607
+ fail();
608
+ });
609
+ });
610
+ it("should share item if user is already admin in group", (done) => {
611
+ fetchMock
612
+ .once(
613
+ "https://myorg.maps.arcgis.com/sharing/rest/community/users/jsmith?f=json&token=fake-token",
614
+ OrgAdminUserResponse
615
+ )
616
+ .once(
617
+ "https://myorg.maps.arcgis.com/sharing/rest/search",
618
+ NoResultsSearchResponse
619
+ )
620
+ .get(
621
+ "https://myorg.maps.arcgis.com/sharing/rest/community/groups/t6b?f=json&token=fake-token",
622
+ GroupOwnerResponse
623
+ )
624
+ .once(
625
+ "https://myorg.maps.arcgis.com/sharing/rest/community/users/casey?f=json&token=fake-token",
626
+ {
627
+ username: "casey",
628
+ orgId: "qWAReEOCnD7eTxOe",
629
+ groups: [
630
+ {
631
+ id: "t6b",
632
+ userMembership: {
633
+ memberType: "admin",
634
+ },
635
+ },
636
+ ] as any[],
637
+ }
638
+ )
639
+ .post(
640
+ "https://myorg.maps.arcgis.com/sharing/rest/content/users/casey/items/n3v/share",
641
+ { notSharedWith: [], itemId: "n3v" }
642
+ );
643
+
644
+ shareItemWithGroup({
645
+ authentication: MOCK_USER_SESSION,
646
+ id: "n3v",
647
+ groupId: "t6b",
648
+ owner: "casey",
649
+ confirmItemControl: true,
650
+ })
651
+ .then((result) => {
652
+ expect(fetchMock.done()).toBeTruthy(
653
+ "All fetchMocks should have been called"
654
+ );
655
+ // verify we shared the item
656
+ const shareOptions: RequestInit = fetchMock.lastOptions(
657
+ "https://myorg.maps.arcgis.com/sharing/rest/content/users/casey/items/n3v/share"
658
+ );
659
+ expect(shareOptions.body).toContain("groups=t6b");
660
+ expect(shareOptions.body).toContain("confirmItemControl=true");
661
+
662
+ done();
663
+ })
664
+ .catch((e) => {
665
+ fail();
666
+ });
667
+ });
668
+ it("should throw if we can not upgrade user membership", (done) => {
669
+ fetchMock
670
+ .once(
671
+ "https://myorg.maps.arcgis.com/sharing/rest/community/users/jsmith?f=json&token=fake-token",
672
+ OrgAdminUserResponse
673
+ )
674
+ .once(
675
+ "https://myorg.maps.arcgis.com/sharing/rest/search",
676
+ NoResultsSearchResponse
677
+ )
678
+ .get(
679
+ "https://myorg.maps.arcgis.com/sharing/rest/community/groups/t6b?f=json&token=fake-token",
680
+ GroupOwnerResponse
681
+ )
682
+ .once(
683
+ "https://myorg.maps.arcgis.com/sharing/rest/community/users/casey?f=json&token=fake-token",
684
+ {
685
+ username: "casey",
686
+ orgId: "qWAReEOCnD7eTxOe",
687
+ groups: [
688
+ {
689
+ id: "t6b",
690
+ userMembership: {
691
+ memberType: "member",
692
+ },
693
+ },
694
+ ] as any[],
695
+ }
696
+ )
697
+ .post(
698
+ "https://myorg.maps.arcgis.com/sharing/rest/community/groups/t6b/updateUsers",
699
+ { results: [{ username: "casey", success: false }] }
700
+ );
701
+
702
+ return shareItemWithGroup({
703
+ authentication: MOCK_USER_SESSION,
704
+ id: "n3v",
705
+ groupId: "t6b",
706
+ owner: "casey",
707
+ confirmItemControl: true,
708
+ })
709
+ .then(() => {
710
+ expect("").toBe("Should Throw, but it returned");
711
+ fail();
712
+ })
713
+ .catch((e) => {
714
+ expect(fetchMock.done()).toBeTruthy(
715
+ "All fetchMocks should have been called"
716
+ );
717
+ const addUsersOptions: RequestInit = fetchMock.lastOptions(
718
+ "https://myorg.maps.arcgis.com/sharing/rest/community/groups/t6b/updateUsers"
719
+ );
720
+ expect(addUsersOptions.body).toContain("admins=casey");
721
+ expect(e.message).toBe(
722
+ "Error promoting user casey to admin in edit group t6b. Consequently item n3v was not shared to the group."
723
+ );
724
+ done();
725
+ });
726
+ });
727
+ it("should throw if we cannot add the user as a group admin", (done) => {
728
+ fetchMock
729
+ .once(
730
+ "https://myorg.maps.arcgis.com/sharing/rest/community/users/jsmith?f=json&token=fake-token",
731
+ {
732
+ ...OrgAdminUserResponse,
733
+ groups: [],
734
+ }
735
+ )
736
+ .once(
737
+ "https://myorg.maps.arcgis.com/sharing/rest/search",
738
+ NoResultsSearchResponse
739
+ )
740
+ .get(
741
+ "https://myorg.maps.arcgis.com/sharing/rest/community/groups/t6b?f=json&token=fake-token",
742
+ GroupNonMemberUserResponse
743
+ )
744
+ .once(
745
+ "https://myorg.maps.arcgis.com/sharing/rest/community/users/casey?f=json&token=fake-token",
746
+ {
747
+ username: "casey",
748
+ orgId: "qWAReEOCnD7eTxOe",
749
+ groups: [
750
+ {
751
+ id: "t6b",
752
+ userMembership: {
753
+ memberType: "admin",
754
+ },
755
+ },
756
+ ] as any[],
757
+ }
758
+ )
759
+ .post(
760
+ "https://myorg.maps.arcgis.com/sharing/rest/community/groups/t6b/addUsers",
761
+ { errors: [new ArcGISAuthError("my error", 717)] }
762
+ );
763
+
764
+ return shareItemWithGroup({
765
+ authentication: MOCK_USER_SESSION,
766
+ id: "n3v",
767
+ groupId: "t6b",
768
+ owner: "casey",
769
+ confirmItemControl: true,
770
+ })
771
+ .then(() => {
772
+ expect("").toBe("Should Throw, but it returned");
773
+ fail();
774
+ })
775
+ .catch((e) => {
776
+ expect(fetchMock.done()).toBeTruthy(
777
+ "All fetchMocks should have been called"
778
+ );
779
+ expect(e.message).toBe(
780
+ "Error adding jsmith as member to edit group t6b. Consequently item n3v was not shared to the group."
781
+ );
782
+ done();
783
+ });
784
+ });
785
+ it("should throw when a non org admin, non group member attempts to share a view group", (done) => {
786
+ fetchMock
787
+ .once(
788
+ "https://myorg.maps.arcgis.com/sharing/rest/community/users/jsmith?f=json&token=fake-token",
789
+ { ...AnonUserResponse, orgId: "qWAReEOCnD7eTxOe" }
790
+ )
791
+ .once(
792
+ "https://myorg.maps.arcgis.com/sharing/rest/search",
793
+ NoResultsSearchResponse
794
+ )
795
+ .get(
796
+ "https://myorg.maps.arcgis.com/sharing/rest/community/groups/t6b?f=json&token=fake-token",
797
+ GroupNonMemberUserResponse
798
+ )
799
+ .once(
800
+ "https://myorg.maps.arcgis.com/sharing/rest/community/users/casey?f=json&token=fake-token",
801
+ {
802
+ username: "casey",
803
+ orgId: "qWAReEOCnD7eTxOe",
804
+ groups: [
805
+ {
806
+ id: "t6b",
807
+ userMembership: {
808
+ memberType: "member",
809
+ },
810
+ },
811
+ ] as any[],
812
+ }
813
+ );
814
+
815
+ return shareItemWithGroup({
816
+ authentication: MOCK_USER_SESSION,
817
+ id: "n3v",
818
+ groupId: "t6b",
819
+ owner: "casey",
820
+ confirmItemControl: false,
821
+ })
822
+ .then(() => {
823
+ expect("").toBe("Should Throw, but it returned");
824
+ fail();
825
+ })
826
+ .catch((e) => {
827
+ expect(fetchMock.done()).toBeTruthy(
828
+ "All fetchMocks should have been called"
829
+ );
830
+ expect(e.message).toBe(
831
+ "This item can not be shared by jsmith as they are not a member of the specified group t6b."
832
+ );
833
+ done();
834
+ });
835
+ });
836
+ it("should throw if owner is in other org", (done) => {
837
+ fetchMock
838
+ .get(
839
+ "https://myorg.maps.arcgis.com/sharing/rest/community/users/jsmith?f=json&token=fake-token",
840
+ OrgAdminUserResponse
841
+ )
842
+ .once(
843
+ "https://myorg.maps.arcgis.com/sharing/rest/search",
844
+ NoResultsSearchResponse
845
+ )
846
+ .get(
847
+ "https://myorg.maps.arcgis.com/sharing/rest/community/groups/t6b?f=json&token=fake-token",
848
+ GroupOwnerResponse
849
+ )
850
+ .get(
851
+ "https://myorg.maps.arcgis.com/sharing/rest/community/users/casey?f=json&token=fake-token",
852
+ {
853
+ username: "casey",
854
+ orgId: "some-other-org",
855
+ groups: [] as any[],
856
+ }
857
+ );
858
+
859
+ return shareItemWithGroup({
860
+ authentication: MOCK_USER_SESSION,
861
+ id: "n3v",
862
+ groupId: "t6b",
863
+ owner: "casey",
864
+ confirmItemControl: true,
865
+ })
866
+ .then(() => {
867
+ expect("").toBe("Should Throw, but it returned");
868
+ fail();
869
+ })
870
+ .catch((e) => {
871
+ expect(fetchMock.done()).toBeTruthy(
872
+ "All fetchMocks should have been called"
873
+ );
874
+
875
+ expect(e.message).toBe(
876
+ "User casey is not a member of the same org as jsmith. Consequently they can not be added added to group t6b nor can item n3v be shared to the group."
877
+ );
878
+ done();
879
+ });
880
+ });
881
+ it("should throw if owner has > 511 groups", (done) => {
882
+ const caseyUser = {
883
+ username: "casey",
884
+ orgId: "qWAReEOCnD7eTxOe",
885
+ groups: new Array(512),
886
+ };
887
+ caseyUser.groups.fill({ id: "not-real-group" });
888
+ fetchMock
889
+ .get(
890
+ "https://myorg.maps.arcgis.com/sharing/rest/community/users/jsmith?f=json&token=fake-token",
891
+ OrgAdminUserResponse
892
+ )
893
+ .once(
894
+ "https://myorg.maps.arcgis.com/sharing/rest/search",
895
+ NoResultsSearchResponse
896
+ )
897
+ .get(
898
+ "https://myorg.maps.arcgis.com/sharing/rest/community/groups/t6b?f=json&token=fake-token",
899
+ GroupOwnerResponse
900
+ )
901
+ .get(
902
+ "https://myorg.maps.arcgis.com/sharing/rest/community/users/casey?f=json&token=fake-token",
903
+ caseyUser
904
+ );
905
+
906
+ return shareItemWithGroup({
907
+ authentication: MOCK_USER_SESSION,
908
+ id: "n3v",
909
+ groupId: "t6b",
910
+ owner: "casey",
911
+ confirmItemControl: true,
912
+ })
913
+ .then(() => {
914
+ expect("").toBe("Should Throw, but it returned");
915
+ fail();
916
+ })
917
+ .catch((e) => {
918
+ expect(fetchMock.done()).toBeTruthy(
919
+ "All fetchMocks should have been called"
920
+ );
921
+
922
+ expect(e.message).toBe(
923
+ "User casey already has 512 groups, and can not be added to group t6b. Consequently item n3v can not be shared to the group."
924
+ );
925
+ done();
926
+ });
927
+ });
928
+
929
+ it("should throw when updateUserMemberships fails", (done) => {
930
+ fetchMock
931
+ .once(
932
+ "https://myorg.maps.arcgis.com/sharing/rest/community/users/jsmith?f=json&token=fake-token",
933
+ OrgAdminUserResponse
934
+ )
935
+ .once(
936
+ "https://myorg.maps.arcgis.com/sharing/rest/search",
937
+ NoResultsSearchResponse
938
+ )
939
+ .get(
940
+ "https://myorg.maps.arcgis.com/sharing/rest/community/groups/t6b?f=json&token=fake-token",
941
+ GroupOwnerResponse
942
+ )
943
+ .once(
944
+ "https://myorg.maps.arcgis.com/sharing/rest/community/users/casey?f=json&token=fake-token",
945
+ {
946
+ username: "casey",
947
+ orgId: "qWAReEOCnD7eTxOe",
948
+ groups: [
949
+ {
950
+ id: "t6b",
951
+ userMembership: {
952
+ memberType: "member",
953
+ },
954
+ },
955
+ ] as any[],
956
+ }
957
+ )
958
+ .post(
959
+ "https://myorg.maps.arcgis.com/sharing/rest/community/groups/t6b/updateUsers",
960
+ { throws: true }
961
+ );
962
+
963
+ return shareItemWithGroup({
964
+ authentication: MOCK_USER_SESSION,
965
+ id: "n3v",
966
+ groupId: "t6b",
967
+ owner: "casey",
968
+ confirmItemControl: true,
969
+ })
970
+ .then(() => {
971
+ expect("").toBe("Should Throw, but it returned");
972
+ fail();
973
+ })
974
+ .catch((e) => {
975
+ expect(fetchMock.done()).toBeTruthy(
976
+ "All fetchMocks should have been called"
977
+ );
978
+ const addUsersOptions: RequestInit = fetchMock.lastOptions(
979
+ "https://myorg.maps.arcgis.com/sharing/rest/community/groups/t6b/updateUsers"
980
+ );
981
+ expect(addUsersOptions.body).toContain("admins=casey");
982
+ expect(e.message).toBe(
983
+ "Error promoting user casey to admin in edit group t6b. Consequently item n3v was not shared to the group."
984
+ );
985
+ done();
986
+ });
987
+ });
988
+
989
+ it("should add the admin user as a member, share the item, then remove the admin from the group", (done) => {
990
+ fetchMock
991
+ .once(
992
+ "https://myorg.maps.arcgis.com/sharing/rest/community/users/jsmith?f=json&token=fake-token",
993
+ {
994
+ ...OrgAdminUserResponse,
995
+ groups: [],
996
+ }
997
+ )
998
+ .once(
999
+ "https://myorg.maps.arcgis.com/sharing/rest/search",
1000
+ NoResultsSearchResponse
1001
+ )
1002
+ .get(
1003
+ "https://myorg.maps.arcgis.com/sharing/rest/community/groups/t6b?f=json&token=fake-token",
1004
+ GroupNonMemberUserResponse
1005
+ )
1006
+ .once(
1007
+ "https://myorg.maps.arcgis.com/sharing/rest/community/users/casey?f=json&token=fake-token",
1008
+ {
1009
+ username: "casey",
1010
+ orgId: "qWAReEOCnD7eTxOe",
1011
+ groups: [
1012
+ {
1013
+ id: "t6b",
1014
+ userMembership: {
1015
+ memberType: "admin",
1016
+ },
1017
+ },
1018
+ ] as any[],
1019
+ }
1020
+ )
1021
+ .post(
1022
+ "https://myorg.maps.arcgis.com/sharing/rest/community/groups/t6b/addUsers",
1023
+ { notAdded: [] }
1024
+ )
1025
+ .post(
1026
+ "https://myorg.maps.arcgis.com/sharing/rest/content/users/casey/items/n3v/share",
1027
+ { notSharedWith: [], itemId: "nv3" }
1028
+ )
1029
+ .post(
1030
+ "https://myorg.maps.arcgis.com/sharing/rest/community/groups/t6b/removeUsers",
1031
+ { notRemoved: [] }
1032
+ );
1033
+
1034
+ return shareItemWithGroup({
1035
+ authentication: MOCK_USER_SESSION,
1036
+ id: "n3v",
1037
+ groupId: "t6b",
1038
+ owner: "casey",
1039
+ confirmItemControl: true,
1040
+ })
1041
+ .then((result) => {
1042
+ expect(fetchMock.done()).toBeTruthy(
1043
+ "All fetchMocks should have been called"
1044
+ );
1045
+ const shareOptions: RequestInit = fetchMock.lastOptions(
1046
+ "https://myorg.maps.arcgis.com/sharing/rest/content/users/casey/items/n3v/share"
1047
+ );
1048
+ expect(shareOptions.body).toContain("groups=t6b");
1049
+ expect(shareOptions.body).toContain("confirmItemControl=true");
1050
+
1051
+ done();
1052
+ })
1053
+ .catch((e) => {
1054
+ fail();
1055
+ });
1056
+ });
1057
+ it("should add the admin user as a member, share the item, then suppress any removeUser errors", (done) => {
1058
+ fetchMock
1059
+ .once(
1060
+ "https://myorg.maps.arcgis.com/sharing/rest/community/users/jsmith?f=json&token=fake-token",
1061
+ {
1062
+ ...OrgAdminUserResponse,
1063
+ groups: [],
1064
+ }
1065
+ )
1066
+ .once(
1067
+ "https://myorg.maps.arcgis.com/sharing/rest/search",
1068
+ NoResultsSearchResponse
1069
+ )
1070
+ .get(
1071
+ "https://myorg.maps.arcgis.com/sharing/rest/community/groups/t6b?f=json&token=fake-token",
1072
+ GroupNonMemberUserResponse
1073
+ )
1074
+ .once(
1075
+ "https://myorg.maps.arcgis.com/sharing/rest/community/users/casey?f=json&token=fake-token",
1076
+ {
1077
+ username: "casey",
1078
+ orgId: "qWAReEOCnD7eTxOe",
1079
+ groups: [
1080
+ {
1081
+ id: "t6b",
1082
+ userMembership: {
1083
+ memberType: "admin",
1084
+ },
1085
+ },
1086
+ ] as any[],
1087
+ }
1088
+ )
1089
+ .post(
1090
+ "https://myorg.maps.arcgis.com/sharing/rest/community/groups/t6b/addUsers",
1091
+ { notAdded: [] }
1092
+ )
1093
+ .post(
1094
+ "https://myorg.maps.arcgis.com/sharing/rest/content/users/casey/items/n3v/share",
1095
+ { notSharedWith: [], itemId: "nv3" }
1096
+ )
1097
+ .post(
1098
+ "https://myorg.maps.arcgis.com/sharing/rest/community/groups/t6b/removeUsers",
1099
+ { throws: true }
1100
+ );
1101
+
1102
+ return shareItemWithGroup({
1103
+ authentication: MOCK_USER_SESSION,
1104
+ id: "n3v",
1105
+ groupId: "t6b",
1106
+ owner: "casey",
1107
+ confirmItemControl: true,
1108
+ })
1109
+ .then((result) => {
1110
+ expect(fetchMock.done()).toBeTruthy(
1111
+ "All fetchMocks should have been called"
1112
+ );
1113
+ const shareOptions: RequestInit = fetchMock.lastOptions(
1114
+ "https://myorg.maps.arcgis.com/sharing/rest/content/users/casey/items/n3v/share"
1115
+ );
1116
+ expect(shareOptions.body).toContain("groups=t6b");
1117
+ expect(shareOptions.body).toContain("confirmItemControl=true");
1118
+
1119
+ done();
1120
+ })
1121
+ .catch((e) => {
1122
+ fail();
1123
+ });
1124
+ });
1125
+ it("should upgrade user to group admin, add admin as member, then share item, then remove admin user", (done) => {
1126
+ fetchMock
1127
+ .once(
1128
+ "https://myorg.maps.arcgis.com/sharing/rest/community/users/jsmith?f=json&token=fake-token",
1129
+ {
1130
+ ...OrgAdminUserResponse,
1131
+ groups: [
1132
+ {
1133
+ ...OrgAdminUserResponse.groups[0],
1134
+ userMembership: {
1135
+ ...OrgAdminUserResponse.groups[0].userMembership,
1136
+ memberType: "member",
1137
+ },
1138
+ },
1139
+ ],
1140
+ }
1141
+ )
1142
+ .once(
1143
+ "https://myorg.maps.arcgis.com/sharing/rest/search",
1144
+ NoResultsSearchResponse
1145
+ )
1146
+ .get(
1147
+ "https://myorg.maps.arcgis.com/sharing/rest/community/groups/t6b?f=json&token=fake-token",
1148
+ GroupNonMemberResponse
1149
+ )
1150
+ .once(
1151
+ "https://myorg.maps.arcgis.com/sharing/rest/community/users/casey?f=json&token=fake-token",
1152
+ {
1153
+ username: "casey",
1154
+ orgId: "qWAReEOCnD7eTxOe",
1155
+ groups: [
1156
+ {
1157
+ id: "t6b",
1158
+ userMembership: {
1159
+ memberType: "member",
1160
+ },
1161
+ },
1162
+ ] as any[],
1163
+ }
1164
+ )
1165
+ .once(
1166
+ "https://myorg.maps.arcgis.com/sharing/rest/community/groups/t6b/updateUsers",
1167
+ { results: [{ username: "casey", success: true }] }
1168
+ )
1169
+ .post(
1170
+ "https://myorg.maps.arcgis.com/sharing/rest/content/users/casey/items/n3v/share",
1171
+ { notSharedWith: [], itemId: "n3v" }
1172
+ );
1173
+
1174
+ shareItemWithGroup({
1175
+ authentication: MOCK_USER_SESSION,
1176
+ id: "n3v",
1177
+ groupId: "t6b",
1178
+ owner: "casey",
1179
+ confirmItemControl: true,
1180
+ })
1181
+ .then((result) => {
1182
+ expect(fetchMock.done()).toBeTruthy(
1183
+ "All fetchMocks should have been called"
1184
+ );
1185
+ // verify we added casey to t6b
1186
+ const addUsersOptions: RequestInit = fetchMock.lastOptions(
1187
+ "https://myorg.maps.arcgis.com/sharing/rest/community/groups/t6b/updateUsers"
1188
+ );
1189
+ expect(addUsersOptions.body).toContain("admins=casey");
1190
+ // verify we shared the item
1191
+ const shareOptions: RequestInit = fetchMock.lastOptions(
1192
+ "https://myorg.maps.arcgis.com/sharing/rest/content/users/casey/items/n3v/share"
1193
+ );
1194
+ expect(shareOptions.body).toContain("groups=t6b");
1195
+ expect(shareOptions.body).toContain("confirmItemControl=true");
1196
+
1197
+ done();
1198
+ })
1199
+ .catch((e) => {
1200
+ fail();
1201
+ });
1202
+ });
1203
+ });
1204
+ describe("ensureMembership", function() {
1205
+ it("should revert the user promotion and suppress resolved error", (done) => {
1206
+ fetchMock
1207
+ .once(
1208
+ "https://myorg.maps.arcgis.com/sharing/rest/community/groups/t6b/updateUsers",
1209
+ { results: [{ username: "jsmith", success: true }] }
1210
+ )
1211
+ .once(
1212
+ "https://myorg.maps.arcgis.com/sharing/rest/community/groups/t6b/updateUsers",
1213
+ { results: [{ username: "jsmith", success: false }] }
1214
+ );
1215
+ const { revert } = ensureMembership(
1216
+ GroupAdminUserResponse,
1217
+ GroupMemberUserResponse,
1218
+ true,
1219
+ "some error message",
1220
+ {
1221
+ authentication: MOCK_USER_SESSION,
1222
+ id: "n3v",
1223
+ groupId: "t6b",
1224
+ owner: "casey",
1225
+ confirmItemControl: true,
1226
+ }
1227
+ );
1228
+ revert({ notSharedWith: [] } as ISharingResponse)
1229
+ .then(() => {
1230
+ expect(fetchMock.done()).toBeTruthy(
1231
+ "All fetchMocks should have been called"
1232
+ );
1233
+ done();
1234
+ })
1235
+ .catch((e) => {
1236
+ fail();
1237
+ });
1238
+ });
1239
+ it("should revert the user promotion and suppress rejected error", (done) => {
1240
+ fetchMock
1241
+ .once(
1242
+ "https://myorg.maps.arcgis.com/sharing/rest/community/groups/t6b/updateUsers",
1243
+ { results: [{ username: "jsmith", success: true }] }
1244
+ )
1245
+ .once(
1246
+ "https://myorg.maps.arcgis.com/sharing/rest/community/groups/t6b/updateUsers",
1247
+ { throws: true }
1248
+ );
1249
+ const { revert } = ensureMembership(
1250
+ GroupAdminUserResponse,
1251
+ GroupMemberUserResponse,
1252
+ true,
1253
+ "some error message",
1254
+ {
1255
+ authentication: MOCK_USER_SESSION,
1256
+ id: "n3v",
1257
+ groupId: "t6b",
1258
+ owner: "casey",
1259
+ confirmItemControl: true,
1260
+ }
1261
+ );
1262
+ revert({ notSharedWith: [] } as ISharingResponse)
1263
+ .then(() => {
1264
+ expect(fetchMock.done()).toBeTruthy(
1265
+ "All fetchMocks should have been called"
1266
+ );
1267
+ done();
1268
+ })
1269
+ .catch((e) => {
1270
+ fail();
1271
+ });
1272
+ });
1273
+ });
1274
+ describe("share item to admin user's favorites group ::", () => {
1275
+ it("should share item", (done) => {
1276
+ fetchMock
1277
+ .once(
1278
+ "https://myorg.maps.arcgis.com/sharing/rest/community/users/jsmith?f=json&token=fake-token",
1279
+ {
1280
+ ...OrgAdminUserResponse,
1281
+ favGroupId: "t6b",
1282
+ }
1283
+ )
1284
+ .once(
1285
+ "https://myorg.maps.arcgis.com/sharing/rest/search",
1286
+ NoResultsSearchResponse
1287
+ )
1288
+ .get(
1289
+ "https://myorg.maps.arcgis.com/sharing/rest/community/groups/t6b?f=json&token=fake-token",
1290
+ GroupOwnerResponse
1291
+ )
1292
+ .once(
1293
+ "https://myorg.maps.arcgis.com/sharing/rest/community/users/casey?f=json&token=fake-token",
1294
+ {
1295
+ username: "casey",
1296
+ orgId: "qWAReEOCnD7eTxOe",
1297
+ groups: [] as any[],
1298
+ }
1299
+ )
1300
+ .post(
1301
+ "https://myorg.maps.arcgis.com/sharing/rest/content/users/casey/items/n3v/share",
1302
+ { notSharedWith: [], itemId: "n3v" }
1303
+ );
1304
+
1305
+ shareItemWithGroup({
1306
+ authentication: MOCK_USER_SESSION,
1307
+ id: "n3v",
1308
+ groupId: "t6b",
1309
+ owner: "casey",
1310
+ })
1311
+ .then((result) => {
1312
+ expect(fetchMock.done()).toBeTruthy(
1313
+ "All fetchMocks should have been called"
1314
+ );
1315
+ // verify we shared the item
1316
+ const shareOptions: RequestInit = fetchMock.lastOptions(
1317
+ "https://myorg.maps.arcgis.com/sharing/rest/content/users/casey/items/n3v/share"
1318
+ );
1319
+ expect(shareOptions.body).toContain("groups=t6b");
1320
+
1321
+ done();
1322
+ })
1323
+ .catch((e) => {
1324
+ fail();
1325
+ });
1326
+ });
1327
+ });
1328
+ });