@adobe/acc-js-sdk 1.1.12 → 1.1.14

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.
package/compile.js CHANGED
@@ -41,6 +41,7 @@ var resources = [
41
41
  { name: "./crypto.js" },
42
42
  { name: "./application.js" },
43
43
  { name: "./testUtil.js" },
44
+ { file: "../node_modules/qs-stringify/index.js", name: "qs-stringify" },
44
45
  { name: "./client.js" },
45
46
  { name: "./index.js" },
46
47
  ];
@@ -62,6 +62,8 @@
62
62
  link: midSourcing.html
63
63
  - name: Message Center
64
64
  link: messageCenter.html
65
+ - name: Reports Data API
66
+ link: reportData.html
65
67
  - name: --
66
68
  - name: Advanced Topics
67
69
  children:
@@ -264,7 +264,7 @@ const root = await node.linkTarget();
264
264
  <tr><td><b>isNotNull</b></td><td>Returns a boolean which indicates whether or not the current node can take the null value into account.</td></tr>
265
265
  <tr><td><b>isRequired</b></td><td>Returns a boolean which indicates whether or not the value of the current node is mandatory.</td></tr>
266
266
  <tr><td><b>isRoot</b></td><td>Indicates if the node is the root node of a schema, i.e. the first child of the schema node, whose name matches the schema name</td></tr>
267
- <tr><td><b>isSQL</b></td><td>Returns a boolean which indicates whether the current node is mapped in SQL.</td></tr>
267
+ <tr><td><b>isSQL</b></td><td>Returns a boolean which indicates whether the current node is mapped in SQL. There are some inconsistencies in ACC schemas, and sometimes attributes may be defined as both sql and xml (for example: nms:delivery/properties/seedProcessed). Such nodes with have both isSql=true and isMappedAsXml=true</td></tr>
268
268
  <tr><td><b>isTemporaryTable</b></td><td>Returns a boolean indicating whether the table is a temporary table. The table will not be created during database creation.</td></tr>
269
269
  <tr><td><b>unbound</b></td><td>Returns a boolean which indicates whether the current node has an unlimited number of children of the same type.</td></tr>
270
270
  <tr><td><b>joins</b></td><td>Element of type "link" has an array of XtkJoin. See <b>joinNodes</b> method.</td></tr>
@@ -2,6 +2,20 @@
2
2
  layout: page
3
3
  title: Change Log
4
4
  ---
5
+ <section class="changelog"><h1>Version 1.1.14</h1>
6
+ <h2>2022/11/25</h2>
7
+
8
+ <li>Fix a bug calling the nms:seedMember#getAsModel method. This method starts with a lower case letter (unlike other methods which start with an upper case) which was not propertly handled by the SDK</li>
9
+ </section>
10
+
11
+ <section class="changelog"><h1>Version 1.1.13</h1>
12
+ <h2>2022/11/24</h2>
13
+
14
+ <li>Fix a bug with file upload API: API call payload was not passed with the right property. The transport interface uses the "data" property and not the "body" property</li>
15
+ <li>Add "getReportData" API to fetch the data use to create a particular report</li>
16
+ <li>Add unit test to check that schema nodes mapped as both xml and sql are properly handled (as SQL)</li>
17
+ </section>
18
+
5
19
  <section class="changelog"><h1>Version 1.1.12</h1>
6
20
  <h2>2022/11/16</h2>
7
21
 
@@ -0,0 +1,92 @@
1
+ ---
2
+ layout: page
3
+ title: Reports Data API
4
+ ---
5
+
6
+ <p>Campaign provides an API to fetch reports data. Just like all APIs in the SDK, it's been wrapped into a function and will return a XML or JSON object based on the requested representation</p>
7
+
8
+ <p>Function Definition</p>
9
+ <pre class="code">
10
+ client.getReportData = (callContext: any, representation: string) : Promise<any>
11
+ </pre>
12
+ <p>callContext</p>
13
+ <pre class="code">
14
+ {
15
+ reportName: string(Report Name),
16
+ context: string("selection"|"global"),
17
+ schema: string(entity type to be used for selection),
18
+ selection: string(Comma separated list of entity IDs),
19
+ formData: any
20
+ }
21
+ </pre>
22
+
23
+ <p>Usage</p>
24
+ <pre class="code">
25
+ const report = await client.getReportData({
26
+ reportName: "throughput",
27
+ context: "selection",
28
+ schema: "nms:delivery",
29
+ selection: "12133"
30
+ });
31
+ console.log(JSON.stringify(report));
32
+ </pre>
33
+ <p>Usage with multiple entities</p>
34
+ <pre class="code">
35
+ const report = await client.getReportData({
36
+ reportName: "throughput",
37
+ context: "selection",
38
+ schema: "nms:delivery",
39
+ selection: "12133,12134"
40
+ });
41
+ console.log(JSON.stringify(report));
42
+ </pre>
43
+ <p>Usage with form data</p>
44
+ <pre class="code">
45
+ const report = await client.getReportData({
46
+ reportName: "throughput",
47
+ context: "selection",
48
+ schema: "nms:delivery",
49
+ selection: "12133",
50
+ formData: {
51
+ vars_opens: 1,
52
+ userAction: "next",
53
+ ctx: {
54
+ _context: 'selection',
55
+ _reportContext: 'throughput',
56
+ _hasFilter: 'false',
57
+ _selectionCount: '1',
58
+ _selection: '12133',
59
+ vars: {
60
+ '$period': '21600',
61
+ '$trunc': '600',
62
+ '$valueScaleFactor': '6',
63
+ '$dateStepType': 'minute',
64
+ '$dateStepFactor': '10'
65
+ },
66
+ data: {
67
+ deliveryStat: { deliveryStat: [Array] },
68
+ bandwidth: { deliveryStat: [Object] }
69
+ }
70
+ }
71
+ }
72
+ });
73
+ console.log(JSON.stringify(report));
74
+ </pre>
75
+
76
+ <p>A given representation can be forced</p>
77
+ <pre class="code">
78
+ const xmlReport = await client.getReportData({
79
+ reportName: "throughput",
80
+ context: "selection",
81
+ schema: "nms:delivery",
82
+ selection: "12133"
83
+ }, "xml");
84
+ const jsonReport = await client.getReportData({
85
+ reportName: "throughput",
86
+ context: "selection",
87
+ schema: "nms:delivery",
88
+ selection: "12133"
89
+ }, "SimpleJson");
90
+ </pre>
91
+
92
+
package/package-lock.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@adobe/acc-js-sdk",
3
- "version": "1.1.12",
3
+ "version": "1.1.14",
4
4
  "lockfileVersion": 1,
5
5
  "requires": true,
6
6
  "dependencies": {
@@ -3362,6 +3362,11 @@
3362
3362
  "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
3363
3363
  "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="
3364
3364
  },
3365
+ "qs-stringify": {
3366
+ "version": "1.2.1",
3367
+ "resolved": "https://registry.npmjs.org/qs-stringify/-/qs-stringify-1.2.1.tgz",
3368
+ "integrity": "sha512-2N5xGLGZUxpgAYq1fD1LmBSCbxQVsXYt5JU0nU3FuPWO8PlCnKNFQwXkZgyB6mrTdg7IbexX4wxIR403dJw9pw=="
3369
+ },
3365
3370
  "react-is": {
3366
3371
  "version": "17.0.2",
3367
3372
  "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@adobe/acc-js-sdk",
3
- "version": "1.1.12",
3
+ "version": "1.1.14",
4
4
  "description": "ACC Javascript SDK",
5
5
  "main": "src/index.js",
6
6
  "homepage": "https://github.com/adobe/acc-js-sdk#readme",
@@ -11,7 +11,8 @@
11
11
  },
12
12
  "dependencies": {
13
13
  "axios": "^0.25.0",
14
- "jsdom": "^19.0.0"
14
+ "jsdom": "^19.0.0",
15
+ "qs-stringify": "^1.2.1"
15
16
  },
16
17
  "devDependencies": {
17
18
  "docdash": "^1.2.0",
package/src/campaign.js CHANGED
@@ -39,6 +39,8 @@ const { Util } = require("./util.js");
39
39
  static DECRYPT_ERROR(details) { return new CampaignException(undefined, 400, 16384, `SDK-000011 "Cannot decrypt password: password marker is missing`, details); }
40
40
  static SESSION_EXPIRED() { return new CampaignException(undefined, 401, 16384, `SDK-000012 "Session has expired or is invalid. Please reconnect.`); }
41
41
  static FILE_UPLOAD_FAILED(name, details) { return new CampaignException(undefined, 500, 16384, `SDK-000013 "Failed to upload file ${name}`, details); }
42
+ static REPORT_FETCH_FAILED(name, details) { return new CampaignException(undefined, 500, 16384, `SDK-000014 Failed to fetch report ${name}`, details); }
43
+ static FEATURE_NOT_SUPPORTED(name) { return new CampaignException(undefined, 500, 16384, `SDK-000015 ${name} feature is not supported by the ACC instance`); }
42
44
 
43
45
 
44
46
  /**
package/src/client.js CHANGED
@@ -36,6 +36,7 @@ const request = require('./transport.js').request;
36
36
  const Application = require('./application.js').Application;
37
37
  const EntityAccessor = require('./entityAccessor.js').EntityAccessor;
38
38
  const { Util } = require('./util.js');
39
+ const qsStringify = require('qs-stringify');
39
40
 
40
41
  /**
41
42
  * @namespace Campaign
@@ -54,6 +55,9 @@ const { Util } = require('./util.js');
54
55
  *
55
56
  * @typedef {Object} Observer
56
57
  * @memberOf Campaign
58
+ *
59
+ * @typedef {Object} ReportContext
60
+ * @memberOf Campaign
57
61
  */
58
62
 
59
63
 
@@ -548,7 +552,7 @@ const fileUploader = (client) => {
548
552
  processData: false,
549
553
  credentials: 'include',
550
554
  method: 'POST',
551
- body: data,
555
+ data: data,
552
556
  headers: {
553
557
  'x-security-token': client._securityToken,
554
558
  'Cookie': '__sessiontoken=' + client._sessionToken,
@@ -1476,6 +1480,13 @@ class Client {
1476
1480
  throw CampaignException.SOAP_UNKNOWN_METHOD(schemaId, methodName, `Schema '${schemaId}' not found`);
1477
1481
  var schemaName = schema.getAttribute("name");
1478
1482
  var method = that._methodCache.get(schemaId, methodName);
1483
+ if (!method) {
1484
+ // first char of the method name may be lower case (ex: nms:seedMember.getAsModel) but the methodName
1485
+ // variable has been capitalized. Make an attempt to lookup method name without capitalisation
1486
+ const methodNameLC = methodName.substring(0, 1).toLowerCase() + methodName.substring(1);
1487
+ method = that._methodCache.get(schemaId, methodNameLC);
1488
+ if (method) methodName = methodNameLC;
1489
+ }
1479
1490
  if (!method) {
1480
1491
  this._methodCache.put(schema);
1481
1492
  method = that._methodCache.get(schemaId, methodName);
@@ -1764,6 +1775,46 @@ class Client {
1764
1775
  return result;
1765
1776
  }
1766
1777
 
1778
+ /**
1779
+ * This is the exposed/public method to request context data for a specific report.
1780
+ * @param {*} callContext: {reportName: string, schema: string, context: string, selection: string, formData: any}
1781
+ * @param {string} representation the expected representation ('xml', 'BadgerFish', or 'SimpleJson'). If not set, will use the current representation
1782
+ *
1783
+ * @returns {Campaign.ReportContext} an object containing the context data for a specific report
1784
+ */
1785
+ async getReportData(callContext, representation) {
1786
+ try {
1787
+ if(callContext.formData && callContext.formData.ctx) {
1788
+ var xmlCtx = this._fromRepresentation('ctx', callContext.formData.ctx);
1789
+ callContext.formData.ctx = DomUtil.toXMLString(xmlCtx);
1790
+ }
1791
+ const selectionCount = callContext.selection.split(',').length;
1792
+
1793
+ const request = {
1794
+ url: `${this._connectionParameters._endpoint}/report/${callContext.reportName}?${encodeURI(`_noRender=true&_schema=${callContext.schema}&_context=${callContext.context}&_selection=${callContext.selection}`)}&_selectionCount=${selectionCount}`,
1795
+ headers: {
1796
+ 'X-Security-Token': this._securityToken,
1797
+ 'Cookie': '__sessiontoken=' + this._sessionToken,
1798
+ 'Content-Type': 'application/x-www-form-urlencoded'
1799
+ },
1800
+ method: 'POST',
1801
+ credentials: 'include',
1802
+ data : qsStringify(callContext.formData)
1803
+ };
1804
+
1805
+ for (let h in this._connectionParameters._options.extraHttpHeaders)
1806
+ request.headers[h] = this._connectionParameters._options.extraHttpHeaders[h];
1807
+ const body = await this._makeHttpCall(request);
1808
+ if(!body.startsWith("<ctx"))
1809
+ throw CampaignException.FEATURE_NOT_SUPPORTED("Reports Data");
1810
+ const xml = DomUtil.parse(body);
1811
+ const result = this._toRepresentation(xml, representation);
1812
+ return result;
1813
+ } catch(ex) {
1814
+ throw CampaignException.REPORT_FETCH_FAILED(callContext.reportName, ex);
1815
+ }
1816
+ }
1817
+
1767
1818
  /**
1768
1819
  * Ping a Message Center Campaign server (/nl/jsp/mcPing.jsp).
1769
1820
  * Assumes Message Center is installed
@@ -1973,6 +1973,28 @@ describe('Application', () => {
1973
1973
  expect(node.isSQL).toBe(false);
1974
1974
  });
1975
1975
 
1976
+ it("Should have isSQL even if it also has isXML", async () => {
1977
+ const xml = DomUtil.parse(`<schema namespace='nms' name='delivery' mappingType="sql">
1978
+ <element name='delivery' sqltable="NmsDelivery">
1979
+ <element name='properties'>
1980
+ <attribute name="midAccountUsedName" type="string" xml="true"/>
1981
+ <attribute name="seedProcessed" sqlname="iSeedProcessed" type="long" xml="true"/>
1982
+ </element>
1983
+ </element>
1984
+ </schema>`);
1985
+ const schema = newSchema(xml);
1986
+ const properties = await schema.root.findNode("properties");
1987
+ expect(properties.isSQL).toBe(false);
1988
+ // xml only node is not sql
1989
+ const midAccountUsedName = await properties.findNode("@midAccountUsedName");
1990
+ expect(midAccountUsedName.isSQL).toBe(false);
1991
+ expect(midAccountUsedName.isMappedAsXML).toBe(true);
1992
+ // node may be both xml and sql. If that's the case, it's considered sql
1993
+ const seedProcessed = await properties.findNode("@seedProcessed");
1994
+ expect(seedProcessed.isSQL).toBe(true);
1995
+ expect(seedProcessed.isMappedAsXML).toBe(true);
1996
+ });
1997
+
1976
1998
  it("Should be memo and memo data" , async () => {
1977
1999
  const xml = DomUtil.parse(`<schema namespace='nms' name='recipient' label="Recipients" labelSingular="Recipient">
1978
2000
  <element name='recipient' sqltable="NmsRecipient">
@@ -847,6 +847,28 @@ describe('ACC Client', function () {
847
847
  client._transport.mockReturnValueOnce(Mock.LOGON_RESPONSE);
848
848
  await client.NLWS.xtkSession.logon();
849
849
 
850
+ client._transport.mockReturnValueOnce(Mock.GET_XTK_SESSION_SCHEMA_RESPONSE);
851
+ client._transport.mockReturnValueOnce(Promise.resolve(`<?xml version='1.0'?>
852
+ <SOAP-ENV:Envelope xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:ns='urn:xtk:session' xmlns:SOAP-ENV='http://schemas.xmlsoap.org/soap/envelope/'>
853
+ <SOAP-ENV:Body>
854
+ <startsWithLowerCaseResponse xmlns='urn:xtk:session' SOAP-ENV:encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'>
855
+ <presult xsi:type='xsd:int'>44</presult>
856
+ </startsWithLowerCaseResponse>
857
+ </SOAP-ENV:Body>
858
+ </SOAP-ENV:Envelope>`));
859
+
860
+ const response = await client.NLWS.xtkSession.startsWithLowerCase()
861
+ expect(response).toBe(44);
862
+
863
+ client._transport.mockReturnValueOnce(Mock.LOGOFF_RESPONSE);
864
+ await client.NLWS.xtkSession.logoff();
865
+ });
866
+
867
+ it("Should support methods starting with a lower case letter", async () => {
868
+ const client = await Mock.makeClient();
869
+ client._transport.mockReturnValueOnce(Mock.LOGON_RESPONSE);
870
+ await client.NLWS.xtkSession.logon();
871
+
850
872
  client._transport.mockReturnValueOnce(Mock.GET_XTK_SESSION_SCHEMA_RESPONSE);
851
873
  await expect(client.NLWS.xtkSession.nonStatic()).rejects.toMatchObject({ errorCode: "SDK-000009" });
852
874
 
@@ -3224,6 +3246,17 @@ describe('ACC Client', function () {
3224
3246
  type: 'text/html',
3225
3247
  size: 12345
3226
3248
  })
3249
+ expect(client._transport).toHaveBeenNthCalledWith(2,
3250
+ expect.objectContaining({
3251
+ data: expect.anything(),
3252
+ url: expect.any(String),
3253
+ method: 'POST',
3254
+ processData: false,
3255
+ credentials: 'include',
3256
+ headers: expect.anything(),
3257
+ })
3258
+ );
3259
+
3227
3260
  expect(result).toMatchObject({
3228
3261
  md5: "d8e8fca2dc0f896fd7cb4cb0031ba249",
3229
3262
  name: "test.txt",
@@ -3467,4 +3500,66 @@ describe('ACC Client', function () {
3467
3500
  });
3468
3501
  });
3469
3502
 
3503
+ describe("getReport API", () => {
3504
+ it("Should call report API", async () => {
3505
+ const client = await Mock.makeClient();
3506
+ client._transport.mockReturnValueOnce(Mock.LOGON_RESPONSE);
3507
+ await client.NLWS.xtkSession.logon();
3508
+
3509
+ client._transport.mockReturnValueOnce(Mock.REPORT_RESPONSE);
3510
+ const report = await client.getReportData({
3511
+ reportName: "throughput",
3512
+ context: "selection",
3513
+ selection: "12133",
3514
+ schema: "nms:delivery",
3515
+ formData: {ctx: {}}
3516
+ });
3517
+ expect(report._reportContext).toBe("throughput");
3518
+ expect(report._selection).toBe("12133");
3519
+ expect(report.vars.$period).toBe("604800");
3520
+ expect(report.delivery.scheduling.contactDate).toBe("2021-12-07 17:13:39.507Z");
3521
+ expect(report.data.bandwidth.deliveryStat.size).toBe("1.34");
3522
+ expect(report.userInfo).toBeDefined();
3523
+ expect(report.activityHistory).toBeDefined();
3524
+
3525
+ client._transport.mockReturnValueOnce(Mock.LOGOFF_RESPONSE);
3526
+ await client.NLWS.xtkSession.logoff();
3527
+ });
3528
+
3529
+ it("Should fail to get report data, if API is not supported", async () => {
3530
+ const client = await Mock.makeClient();
3531
+ client._transport.mockReturnValueOnce(Mock.LOGON_RESPONSE);
3532
+ await client.NLWS.xtkSession.logon();
3533
+
3534
+ client._transport.mockReturnValueOnce("Invalid response");
3535
+ await expect(client.getReportData({
3536
+ reportName: "throughput",
3537
+ context: "selection",
3538
+ selection: "12133",
3539
+ schema: "nms:delivery"
3540
+ })).rejects.toMatchObject({ statusCode:500, message:"500 - Error 16384: SDK-000014 Failed to fetch report throughput. 500 - Error 16384: SDK-000015 Reports Data feature is not supported by the ACC instance" });
3541
+
3542
+ client._transport.mockReturnValueOnce(Mock.LOGOFF_RESPONSE);
3543
+ await client.NLWS.xtkSession.logoff();
3544
+ });
3545
+
3546
+ it("Should fail to call getReport API", async () => {
3547
+ const client = await Mock.makeClient();
3548
+ client._transport.mockReturnValueOnce(Mock.LOGON_RESPONSE);
3549
+ await client.NLWS.xtkSession.logon();
3550
+ client.traceAPICalls(true);
3551
+
3552
+ client._transport.mockRejectedValueOnce(new HttpError(500, "Error rc=-57"));
3553
+ await expect(client.getReportData({
3554
+ reportName: "throughput",
3555
+ context: "selection",
3556
+ selection: "12133",
3557
+ schema: "nms:delivery"
3558
+ })).rejects.toMatchObject({ statusCode:500, message:"500 - Error 16384: SDK-000014 Failed to fetch report throughput. 500 - Error calling method '/report/throughput?_noRender=true&_schema=nms:delivery&_context=selection&_selection=12133&_selectionCount=1': Error rc=-57" });
3559
+
3560
+ client._transport.mockReturnValueOnce(Mock.LOGOFF_RESPONSE);
3561
+ await client.NLWS.xtkSession.logoff();
3562
+ });
3563
+ });
3564
+
3470
3565
  });
package/test/mock.js CHANGED
@@ -70,6 +70,39 @@ const PING = Promise.resolve("OK\n2021-08-27 15:43:48.862Z\n");
70
70
  const MC_PING = Promise.resolve("Ok\n2021-08-27 15:48:07.893Z\n7/400 pending events");
71
71
  const MC_PING_ERROR = Promise.resolve("Error\nThe queue is full (7/400)");
72
72
 
73
+ const REPORT_RESPONSE = Promise.resolve(`<ctx lang="en" date="2022-11-09T06:10:27Z" _target="web" alt_period="604800" statsCount="1" webApp-id="1569" _context="selection" _reportContext="throughput" _hasFilter="false" _selectionCount="1" _selection="12133" _schema="nms:delivery" _folderModel="nmsDelivery" _folderLinkId="@folder-id" _folderLink="folder" activityHist="xxx">
74
+ <userInfo datakitInDatabase="true" homeDir="" instanceLocale="en-US" locale="en-US" login="admin" loginCS="Administrator (admin)" loginId="1059" noConsoleCnx="false" orgUnitId="0" theme="" timezone="Asia/Kolkata" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns="urn:xtk:session" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
75
+ <login-group id="1060"/>
76
+ <login-right right="admin"/>
77
+ </userInfo>
78
+ <vars>
79
+ <period>604800</period>
80
+ <trunc>3600</trunc>
81
+ <valueScaleFactor>1</valueScaleFactor>
82
+ <dateStepType>hour</dateStepType>
83
+ <dateStepFactor>1</dateStepFactor>
84
+ </vars>
85
+ <activityHistory>
86
+ <activity name="page" type="page"/>
87
+ <activity name="script" type="script"/>
88
+ <activity name="query2" type="query"/>
89
+ <activity name="test" type="test"/>
90
+ </activityHistory>
91
+ <delivery label="Email delivery">
92
+ <scheduling contactDate="2021-12-07 17:13:39.507Z"/>
93
+ </delivery>
94
+ <title>Delivery: Email delivery</title>
95
+ <data>
96
+ <deliveryStat>
97
+ <deliveryStat date="2021-12-07 17:30:00.000Z" count="1" series="Success"/>
98
+ <deliveryStat date="2021-12-07 17:30:00.000Z" count="0" series="Errors"/>
99
+ </deliveryStat>
100
+ <bandwidth>
101
+ <deliveryStat date="2021-12-07 17:30:00.000Z" size="1.34"/>
102
+ </bandwidth>
103
+ </data>
104
+ </ctx>`);
105
+
73
106
  const LOGON_RESPONSE = Promise.resolve(`<?xml version='1.0'?>
74
107
  <SOAP-ENV:Envelope xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:ns='urn:xtk:session' xmlns:SOAP-ENV='http://schemas.xmlsoap.org/soap/envelope/'>
75
108
  <SOAP-ENV:Body>
@@ -242,6 +275,11 @@ const GET_XTK_SESSION_SCHEMA_RESPONSE = Promise.resolve(`<?xml version='1.0'?>
242
275
  <param name="name" type="string"/>
243
276
  </parameters>
244
277
  </method>
278
+ <method name="startsWithLowerCase" static="true">
279
+ <parameters>
280
+ <param name="result" type="long" inout="out"/>
281
+ </parameters>
282
+ </method>
245
283
  </methods>
246
284
  </schema>
247
285
  </pdomDoc>
@@ -828,6 +866,7 @@ exports.Mock = {
828
866
  PING: PING,
829
867
  MC_PING: MC_PING,
830
868
  MC_PING_ERROR: MC_PING_ERROR,
869
+ REPORT_RESPONSE: REPORT_RESPONSE,
831
870
  LOGON_RESPONSE: LOGON_RESPONSE,
832
871
  BEARER_LOGON_RESPONSE: BEARER_LOGON_RESPONSE,
833
872
  LOGON_RESPONSE_NO_SESSIONTOKEN: LOGON_RESPONSE_NO_SESSIONTOKEN,