@microsoft/connected-workbooks 2.1.24-beta → 3.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 (46) hide show
  1. package/README.md +25 -13
  2. package/dist/generators.js +1 -1
  3. package/dist/{GridParser.js → gridParser.js} +18 -8
  4. package/dist/gridUtils.js +58 -0
  5. package/dist/index.d.ts +2 -2
  6. package/dist/src/generators.js +14 -0
  7. package/dist/src/types.js +28 -0
  8. package/dist/src/utils/arrayUtils.js +46 -0
  9. package/dist/src/utils/constants.js +145 -0
  10. package/dist/src/utils/documentUtils.js +102 -0
  11. package/dist/src/utils/gridUtils.js +103 -0
  12. package/dist/src/utils/htmlUtils.js +19 -0
  13. package/dist/src/utils/index.js +24 -0
  14. package/dist/src/utils/mashupDocumentParser.js +145 -0
  15. package/dist/src/utils/pqUtils.js +100 -0
  16. package/dist/src/utils/tableUtils.js +143 -0
  17. package/dist/src/utils/xmlInnerPartsUtils.js +227 -0
  18. package/dist/src/utils/xmlPartsUtils.js +68 -0
  19. package/dist/src/workbookTemplate.js +7 -0
  20. package/dist/tests/arrayUtils.test.js +65 -0
  21. package/dist/tests/documentUtils.test.js +35 -0
  22. package/dist/tests/gridUtils.test.js +168 -0
  23. package/dist/tests/htmlUtils.test.js +109 -0
  24. package/dist/tests/mashupDocumentParser.test.js +59 -0
  25. package/dist/tests/mocks/PqMock.js +7 -0
  26. package/dist/tests/mocks/index.js +24 -0
  27. package/dist/tests/mocks/section1mSimpleQueryMock.js +18 -0
  28. package/dist/tests/mocks/xmlMocks.js +12 -0
  29. package/dist/tests/tableUtils.test.js +63 -0
  30. package/dist/tests/workbookQueryTemplate.test.js +64 -0
  31. package/dist/tests/workbookTableTemplate.test.js +54 -0
  32. package/dist/tests/xmlInnerPartsUtils.test.js +51 -0
  33. package/dist/types.d.ts +4 -1
  34. package/dist/utils/constants.js +20 -9
  35. package/dist/utils/documentUtils.js +9 -5
  36. package/dist/utils/gridUtils.js +103 -0
  37. package/dist/utils/htmlUtils.js +3 -3
  38. package/dist/utils/index.js +5 -1
  39. package/dist/utils/mashupDocumentParser.js +6 -24
  40. package/dist/utils/pqUtils.js +7 -4
  41. package/dist/utils/tableUtils.js +18 -19
  42. package/dist/utils/xmlInnerPartsUtils.js +38 -9
  43. package/dist/utils/xmlPartsUtils.js +12 -6
  44. package/dist/workbookManager.d.ts +3 -3
  45. package/dist/workbookManager.js +17 -22
  46. package/package.json +5 -3
@@ -0,0 +1,168 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const constants_1 = require("../src/utils/constants");
7
+ const gridUtils_1 = __importDefault(require("../src/utils/gridUtils"));
8
+ const columnName = (i) => `${constants_1.defaults.columnName} ${i}`;
9
+ describe("Grid Utils tests", () => {
10
+ test.concurrent.each([
11
+ ["null grid", null, { columnNames: [columnName(1)], rows: [[""]] }],
12
+ ["null grid data", { data: null }, { columnNames: [columnName(1)], rows: [[""]] }],
13
+ ["empty grid 1", { data: [] }, { columnNames: [columnName(1)], rows: [[""]] }],
14
+ ["empty grid 2", { data: [[]] }, { columnNames: [columnName(1)], rows: [[""]] }],
15
+ ["empty grid with empty rows", { data: [[], []] }, { columnNames: [columnName(1)], rows: [[""], [""]] }],
16
+ [
17
+ "happy path, no headers",
18
+ {
19
+ data: [
20
+ ["1", "2"],
21
+ ["3", "4"],
22
+ ],
23
+ },
24
+ {
25
+ columnNames: [columnName(1), columnName(2)],
26
+ rows: [
27
+ ["1", "2"],
28
+ ["3", "4"],
29
+ ],
30
+ },
31
+ ],
32
+ [
33
+ "type conversions, no headers",
34
+ {
35
+ data: [
36
+ [true, 3],
37
+ ["3", "4"],
38
+ ],
39
+ },
40
+ {
41
+ columnNames: ["Column 1", "Column 2"],
42
+ rows: [
43
+ ["true", "3"],
44
+ ["3", "4"],
45
+ ],
46
+ },
47
+ ],
48
+ [
49
+ "fill in empty rows",
50
+ { data: [["1", "2"], [], ["3", "4"]] },
51
+ {
52
+ columnNames: [columnName(1), columnName(2)],
53
+ rows: [
54
+ ["1", "2"],
55
+ ["", ""],
56
+ ["3", "4"],
57
+ ],
58
+ },
59
+ ],
60
+ [
61
+ "promote headers with empty array",
62
+ { data: [], config: { promoteHeaders: true } },
63
+ {
64
+ columnNames: [columnName(1)],
65
+ rows: [[""]],
66
+ },
67
+ ],
68
+ [
69
+ "promote headers with empty row",
70
+ { data: [[]], config: { promoteHeaders: true } },
71
+ {
72
+ columnNames: [columnName(1)],
73
+ rows: [[""]],
74
+ },
75
+ ],
76
+ [
77
+ "promote headers, basic",
78
+ {
79
+ data: [
80
+ ["1", "2"],
81
+ ["3", "4"],
82
+ ],
83
+ config: { promoteHeaders: true },
84
+ },
85
+ {
86
+ columnNames: ["1", "2"],
87
+ rows: [["3", "4"]],
88
+ },
89
+ ],
90
+ [
91
+ "promote headers with empty array, without adjust column names",
92
+ { data: [], config: { promoteHeaders: true, adjustColumnNames: false } },
93
+ {
94
+ columnNames: [columnName(1)],
95
+ rows: [[""]],
96
+ },
97
+ ],
98
+ [
99
+ "promote headers, adjust column names, basic",
100
+ {
101
+ data: [
102
+ ["A", "A", "B"],
103
+ ["1", "2", "3"],
104
+ ],
105
+ config: { promoteHeaders: true },
106
+ },
107
+ {
108
+ columnNames: ["A", "A (1)", "B"],
109
+ rows: [["1", "2", "3"]],
110
+ },
111
+ ],
112
+ [
113
+ "promote headers, adjust column names, multiple",
114
+ {
115
+ data: [
116
+ ["A", "A", "B", "C", "B", "A"],
117
+ [1, 2, 3, 4, 5, 6],
118
+ [7, 8, 9, 10, 11, 12],
119
+ ],
120
+ config: { promoteHeaders: true },
121
+ },
122
+ {
123
+ columnNames: ["A", "A (1)", "B", "C", "B (1)", "A (2)"],
124
+ rows: [
125
+ ["1", "2", "3", "4", "5", "6"],
126
+ ["7", "8", "9", "10", "11", "12"],
127
+ ],
128
+ },
129
+ ],
130
+ [
131
+ "promote headers, adjust column names, types",
132
+ { data: [[true, true]], config: { promoteHeaders: true } },
133
+ {
134
+ columnNames: ["true", "true (1)"],
135
+ rows: [["", ""]],
136
+ },
137
+ ],
138
+ ])("%s:\n\t%j should be parsed to %j", (scenario, input, expected) => {
139
+ expect(gridUtils_1.default.parseToTableData(input)).toEqual(expected);
140
+ });
141
+ // promote headers, without adjust column names, errors
142
+ test.concurrent.each([
143
+ [[[]]],
144
+ [[["A", "B", "A"]]],
145
+ [[["A", 3, "B", 3]]],
146
+ [[[true, "true"]]],
147
+ [
148
+ [
149
+ ["אבג", "אבג"],
150
+ ["1", "2"],
151
+ ],
152
+ ],
153
+ ])(`parsing %j should throw "${constants_1.promotedHeadersCannotBeUsedWithoutAdjustingColumnNamesErr}"`, (input) => {
154
+ expect(() => gridUtils_1.default.parseToTableData({ data: input, config: { promoteHeaders: true, adjustColumnNames: false } })).toThrowError(constants_1.promotedHeadersCannotBeUsedWithoutAdjustingColumnNamesErr);
155
+ });
156
+ // array isn't MxN
157
+ test.concurrent.each([
158
+ [
159
+ [
160
+ ["A", "B", "A"],
161
+ ["1", "2"],
162
+ ],
163
+ ],
164
+ [[["אבג", "אבג"], ["1", "2"], ["3"]]],
165
+ ])(`parsing %j should throw "${constants_1.arrayIsntMxNErr}"`, (input) => {
166
+ expect(() => gridUtils_1.default.parseToTableData({ data: input, config: { promoteHeaders: true, adjustColumnNames: false } })).toThrowError(constants_1.arrayIsntMxNErr);
167
+ });
168
+ });
@@ -0,0 +1,109 @@
1
+ "use strict";
2
+ // Copyright (c) Microsoft Corporation.
3
+ // Licensed under the MIT license.
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ const utils_1 = require("../src/utils");
6
+ const jsdom_1 = require("jsdom");
7
+ // Create a JSDOM instance
8
+ const { window } = new jsdom_1.JSDOM("<!DOCTYPE html><html><body></body></html>");
9
+ const document = window.document;
10
+ // Helper function to create table rows and cells
11
+ const createRowWithCells = (cellValues, celltypes = "td") => {
12
+ const row = document.createElement("tr");
13
+ cellValues.forEach((value) => {
14
+ const cell = document.createElement(celltypes);
15
+ cell.textContent = value;
16
+ row.appendChild(cell);
17
+ });
18
+ return row;
19
+ };
20
+ describe("extractTableValues", () => {
21
+ test("returns an empty array for an empty table", () => {
22
+ // Create an empty table element
23
+ const table = document.createElement("table");
24
+ // Call the method and expect an empty array as the result
25
+ expect(utils_1.htmlUtils.extractTableValues(table)).toEqual([]);
26
+ });
27
+ test("returns an empty row for an empty tr", () => {
28
+ const table = document.createElement("table");
29
+ const tbody = document.createElement("tbody");
30
+ const row = createRowWithCells([]);
31
+ tbody.appendChild(row);
32
+ table.appendChild(tbody);
33
+ expect(utils_1.htmlUtils.extractTableValues(table)).toEqual([[]]);
34
+ });
35
+ test("extracts values correctly from a table with multiple rows and cells", () => {
36
+ const table = document.createElement("table");
37
+ const tbody = document.createElement("tbody");
38
+ const row1 = createRowWithCells(["A", "B"]);
39
+ const row2 = createRowWithCells(["C", "D"]);
40
+ tbody.appendChild(row1);
41
+ tbody.appendChild(row2);
42
+ table.appendChild(tbody);
43
+ const expectedResult = [
44
+ ["A", "B"],
45
+ ["C", "D"],
46
+ ];
47
+ expect(utils_1.htmlUtils.extractTableValues(table)).toEqual(expectedResult);
48
+ });
49
+ test("handles empty cells by using an empty string", () => {
50
+ const table = document.createElement("table");
51
+ const tbody = document.createElement("tbody");
52
+ const row1 = createRowWithCells(["A", ""]);
53
+ const row2 = createRowWithCells(["", "D"]);
54
+ tbody.appendChild(row1);
55
+ tbody.appendChild(row2);
56
+ table.appendChild(tbody);
57
+ const expectedResult = [
58
+ ["A", ""],
59
+ ["", "D"],
60
+ ];
61
+ expect(utils_1.htmlUtils.extractTableValues(table)).toEqual(expectedResult);
62
+ });
63
+ test("handle table header (th) cells", () => {
64
+ const table = document.createElement("table");
65
+ const tbody = document.createElement("tbody");
66
+ const headerRow = createRowWithCells(["Header 1", "Header 2"], "th");
67
+ const dataRow = createRowWithCells(["A", "B"]);
68
+ tbody.appendChild(headerRow);
69
+ tbody.appendChild(dataRow);
70
+ table.appendChild(tbody);
71
+ const expectedResult = [
72
+ ["Header 1", "Header 2"],
73
+ ["A", "B"],
74
+ ];
75
+ expect(utils_1.htmlUtils.extractTableValues(table)).toEqual(expectedResult);
76
+ });
77
+ test("handles tables with multiple tbody elements", () => {
78
+ const table = document.createElement("table");
79
+ const tbody1 = document.createElement("tbody");
80
+ const row1 = createRowWithCells(["A", "B"]);
81
+ tbody1.appendChild(row1);
82
+ table.appendChild(tbody1);
83
+ const tbody2 = document.createElement("tbody");
84
+ const row2 = createRowWithCells(["C", "D"]);
85
+ tbody2.appendChild(row2);
86
+ table.appendChild(tbody2);
87
+ const expectedResult = [
88
+ ["A", "B"],
89
+ ["C", "D"],
90
+ ];
91
+ expect(utils_1.htmlUtils.extractTableValues(table)).toEqual(expectedResult);
92
+ });
93
+ test("handles tables that are not MxN", () => {
94
+ const table = document.createElement("table");
95
+ const tbody1 = document.createElement("tbody");
96
+ const row1 = createRowWithCells(["A", "B"]);
97
+ tbody1.appendChild(row1);
98
+ table.appendChild(tbody1);
99
+ const tbody2 = document.createElement("tbody");
100
+ const row2 = createRowWithCells(["C", "D", "E"]);
101
+ tbody2.appendChild(row2);
102
+ table.appendChild(tbody2);
103
+ const expectedResult = [
104
+ ["A", "B"],
105
+ ["C", "D", "E"],
106
+ ];
107
+ expect(utils_1.htmlUtils.extractTableValues(table)).toEqual(expectedResult);
108
+ });
109
+ });
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ // Copyright (c) Microsoft Corporation.
3
+ // Licensed under the MIT license.
4
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
5
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
6
+ return new (P || (P = Promise))(function (resolve, reject) {
7
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
8
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
9
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
10
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
11
+ });
12
+ };
13
+ var __importDefault = (this && this.__importDefault) || function (mod) {
14
+ return (mod && mod.__esModule) ? mod : { "default": mod };
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ const util_1 = require("util");
18
+ const mashupDocumentParser_1 = require("../src/utils/mashupDocumentParser");
19
+ const utils_1 = require("../src/utils");
20
+ const mocks_1 = require("./mocks");
21
+ const base64_js_1 = __importDefault(require("base64-js"));
22
+ const jszip_1 = __importDefault(require("jszip"));
23
+ const workbookTemplate_1 = require("../src/workbookTemplate");
24
+ const constants_1 = require("../src/utils/constants");
25
+ const util_2 = __importDefault(require("util"));
26
+ global.TextDecoder = util_1.TextDecoder;
27
+ global.TextEncoder = util_1.TextEncoder;
28
+ describe("Mashup Document Parser tests", () => {
29
+ test("ReplaceSingleQuery test", () => __awaiter(void 0, void 0, void 0, function* () {
30
+ var _a;
31
+ const defaultZipFile = yield jszip_1.default.loadAsync(workbookTemplate_1.SIMPLE_QUERY_WORKBOOK_TEMPLATE, { base64: true });
32
+ const originalBase64Str = yield utils_1.pqUtils.getBase64(defaultZipFile);
33
+ if (originalBase64Str) {
34
+ const replacedQueryBase64Str = yield (0, mashupDocumentParser_1.replaceSingleQuery)(originalBase64Str, "newQueryName", mocks_1.section1mNewQueryNameSimpleMock);
35
+ const buffer = base64_js_1.default.toByteArray(replacedQueryBase64Str).buffer;
36
+ const mashupArray = new utils_1.arrayUtils.ArrayReader(buffer);
37
+ const startArray = mashupArray.getBytes(4);
38
+ const packageSize = mashupArray.getInt32();
39
+ const packageOPC = mashupArray.getBytes(packageSize);
40
+ const zip = yield jszip_1.default.loadAsync(packageOPC);
41
+ const section1m = yield ((_a = zip.file(constants_1.section1mPath)) === null || _a === void 0 ? void 0 : _a.async("text"));
42
+ if (section1m) {
43
+ const mocksection1 = mocks_1.section1mNewQueryNameSimpleMock.replace(/ /g, "");
44
+ expect(section1m.replace(/ /g, "")).toEqual(mocksection1);
45
+ }
46
+ }
47
+ }));
48
+ test("Power Query MetadataXml test", () => __awaiter(void 0, void 0, void 0, function* () {
49
+ const defaultZipFile = yield jszip_1.default.loadAsync(workbookTemplate_1.SIMPLE_QUERY_WORKBOOK_TEMPLATE, { base64: true });
50
+ const originalBase64Str = yield utils_1.pqUtils.getBase64(defaultZipFile);
51
+ if (originalBase64Str) {
52
+ const { metadata } = (0, mashupDocumentParser_1.getPackageComponents)(originalBase64Str);
53
+ const newMetadataArray = (0, mashupDocumentParser_1.editSingleQueryMetadata)(metadata, { queryName: "newQueryName" });
54
+ const metadataString = new util_2.default.TextDecoder("utf-8").decode(newMetadataArray);
55
+ expect(metadataString.replace(/ /g, "")).toContain(mocks_1.pqMetadataXmlMockPart1.replace(/ /g, ""));
56
+ expect(metadataString.replace(/ /g, "")).toContain(mocks_1.pqMetadataXmlMockPart2.replace(/ /g, ""));
57
+ }
58
+ }));
59
+ });
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.relationshipInfo = exports.item2Path = exports.item1Path = exports.pqEmptySingleQueryBase64 = void 0;
4
+ exports.pqEmptySingleQueryBase64 = "AAAAAD8DAABQSwMEFAACAAgANG8kVJyKlF+iAAAA9QAAABIAHABDb25maWcvUGFja2FnZS54bWwgohgAKKAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAhY+xDoIwFEV/hXSnLXUR8iiDqyQmROPaQMVGeBhaLP/m4Cf5C2IUdXO8557h3vv1BtnYNsFF99Z0mJKIchJoLLvKYJ2SwR3CJckkbFR5UrUOJhltMtoqJUfnzglj3nvqF7TrayY4j9g+XxflUbeKfGTzXw4NWqew1ETC7jVGChrHVHBBObCZQW7w24tp7rP9gbAaGjf0WmoMtwWwOQJ7X5APUEsDBBQAAgAIADRvJFQPyumrpAAAAOkAAAATABwAW0NvbnRlbnRfVHlwZXNdLnhtbCCiGAAooBQAAAAAAAAAAAAAAAAAAAAAAAAAAABtjksOwjAMRK8SeZ+6sEAINWUB3IALRMH9iOajxkXhbCw4ElcgbXeIpWfmeebzelfHZAfxoDH23inYFCUIcsbfetcqmLiRezjW1fUZKIocdVFBxxwOiNF0ZHUsfCCXncaPVnM+xxaDNnfdEm7LcofGOybHkucfUFdnavQ0sLikLK+1GQdxWnNzlQKmxLjI+JewP3kdwtAbzdnEJG2UdiFxGV5/AVBLAwQUAAIACAA0byRUPfc/WjsAAABKAAAAEwAcAEZvcm11bGFzL1NlY3Rpb24xLm0gohgAKKAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAK05NLsnMz1MIhtCG1rxcvFzFGYlFqSkKgaWpRZWGCrYKOaklvFwKQBCcX1qUnAoUUVLi5crMQxa0BgBQSwECLQAUAAIACAA0byRUnIqUX6IAAAD1AAAAEgAAAAAAAAAAAAAAAAAAAAAAQ29uZmlnL1BhY2thZ2UueG1sUEsBAi0AFAACAAgANG8kVA/K6aukAAAA6QAAABMAAAAAAAAAAAAAAAAA7gAAAFtDb250ZW50X1R5cGVzXS54bWxQSwECLQAUAAIACAA0byRUPfc/WjsAAABKAAAAEwAAAAAAAAAAAAAAAADfAQAARm9ybXVsYXMvU2VjdGlvbjEubVBLBQYAAAAAAwADAMIAAABnAgAAAAAQAQAA77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48UGVybWlzc2lvbkxpc3QgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI+PENhbkV2YWx1YXRlRnV0dXJlUGFja2FnZXM+ZmFsc2U8L0NhbkV2YWx1YXRlRnV0dXJlUGFja2FnZXM+PEZpcmV3YWxsRW5hYmxlZD50cnVlPC9GaXJld2FsbEVuYWJsZWQ+PC9QZXJtaXNzaW9uTGlzdD5XBwAAAAAAADUHAADvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PjxMb2NhbFBhY2thZ2VNZXRhZGF0YUZpbGUgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI+PEl0ZW1zPjxJdGVtPjxJdGVtTG9jYXRpb24+PEl0ZW1UeXBlPkFsbEZvcm11bGFzPC9JdGVtVHlwZT48SXRlbVBhdGggLz48L0l0ZW1Mb2NhdGlvbj48U3RhYmxlRW50cmllcyAvPjwvSXRlbT48SXRlbT48SXRlbUxvY2F0aW9uPjxJdGVtVHlwZT5Gb3JtdWxhPC9JdGVtVHlwZT48SXRlbVBhdGg+U2VjdGlvbjEvUXVlcnkxPC9JdGVtUGF0aD48L0l0ZW1Mb2NhdGlvbj48U3RhYmxlRW50cmllcz48RW50cnkgVHlwZT0iSXNQcml2YXRlIiBWYWx1ZT0ibDAiIC8+PEVudHJ5IFR5cGU9IkZpbGxFbmFibGVkIiBWYWx1ZT0ibDEiIC8+PEVudHJ5IFR5cGU9IkZpbGxPYmplY3RUeXBlIiBWYWx1ZT0ic1RhYmxlIiAvPjxFbnRyeSBUeXBlPSJGaWxsVG9EYXRhTW9kZWxFbmFibGVkIiBWYWx1ZT0ibDAiIC8+PEVudHJ5IFR5cGU9IkJ1ZmZlck5leHRSZWZyZXNoIiBWYWx1ZT0ibDEiIC8+PEVudHJ5IFR5cGU9IlJlc3VsdFR5cGUiIFZhbHVlPSJzVGV4dCIgLz48RW50cnkgVHlwZT0iTmFtZVVwZGF0ZWRBZnRlckZpbGwiIFZhbHVlPSJsMCIgLz48RW50cnkgVHlwZT0iTmF2aWdhdGlvblN0ZXBOYW1lIiBWYWx1ZT0ic05hdmlnYXRpb24iIC8+PEVudHJ5IFR5cGU9IkZpbGxUYXJnZXQiIFZhbHVlPSJzUXVlcnkxIiAvPjxFbnRyeSBUeXBlPSJGaWxsZWRDb21wbGV0ZVJlc3VsdFRvV29ya3NoZWV0IiBWYWx1ZT0ibDEiIC8+PEVudHJ5IFR5cGU9IkFkZGVkVG9EYXRhTW9kZWwiIFZhbHVlPSJsMCIgLz48RW50cnkgVHlwZT0iRmlsbENvdW50IiBWYWx1ZT0ibDEiIC8+PEVudHJ5IFR5cGU9IkZpbGxFcnJvckNvZGUiIFZhbHVlPSJzVW5rbm93biIgLz48RW50cnkgVHlwZT0iRmlsbEVycm9yQ291bnQiIFZhbHVlPSJsMCIgLz48RW50cnkgVHlwZT0iRmlsbExhc3RVcGRhdGVkIiBWYWx1ZT0iZDIwMjItMDEtMDRUMTM6NTc6NDEuNDI4Njg3NloiIC8+PEVudHJ5IFR5cGU9IkZpbGxDb2x1bW5UeXBlcyIgVmFsdWU9InNCZz09IiAvPjxFbnRyeSBUeXBlPSJGaWxsQ29sdW1uTmFtZXMiIFZhbHVlPSJzWyZxdW90O1F1ZXJ5MSZxdW90O10iIC8+PEVudHJ5IFR5cGU9IkZpbGxTdGF0dXMiIFZhbHVlPSJzQ29tcGxldGUiIC8+PEVudHJ5IFR5cGU9IlJlbGF0aW9uc2hpcEluZm9Db250YWluZXIiIFZhbHVlPSJzeyZxdW90O2NvbHVtbkNvdW50JnF1b3Q7OjEsJnF1b3Q7a2V5Q29sdW1uTmFtZXMmcXVvdDs6W10sJnF1b3Q7cXVlcnlSZWxhdGlvbnNoaXBzJnF1b3Q7OltdLCZxdW90O2NvbHVtbklkZW50aXRpZXMmcXVvdDs6WyZxdW90O1NlY3Rpb24xL1F1ZXJ5MS9BdXRvUmVtb3ZlZENvbHVtbnMxLntRdWVyeTEsMH0mcXVvdDtdLCZxdW90O0NvbHVtbkNvdW50JnF1b3Q7OjEsJnF1b3Q7S2V5Q29sdW1uTmFtZXMmcXVvdDs6W10sJnF1b3Q7Q29sdW1uSWRlbnRpdGllcyZxdW90OzpbJnF1b3Q7U2VjdGlvbjEvUXVlcnkxL0F1dG9SZW1vdmVkQ29sdW1uczEue1F1ZXJ5MSwwfSZxdW90O10sJnF1b3Q7UmVsYXRpb25zaGlwSW5mbyZxdW90OzpbXX0iIC8+PC9TdGFibGVFbnRyaWVzPjwvSXRlbT48SXRlbT48SXRlbUxvY2F0aW9uPjxJdGVtVHlwZT5Gb3JtdWxhPC9JdGVtVHlwZT48SXRlbVBhdGg+U2VjdGlvbjEvUXVlcnkxL1NvdXJjZTwvSXRlbVBhdGg+PC9JdGVtTG9jYXRpb24+PFN0YWJsZUVudHJpZXMgLz48L0l0ZW0+PC9JdGVtcz48L0xvY2FsUGFja2FnZU1ldGFkYXRhRmlsZT4WAAAAUEsFBgAAAAAAAAAAAAAAAAAAAAAAANoAAAABAAAA0Iyd3wEV0RGMegDAT8KX6wEAAABs6pJSrvyBRolDTEcY9br+AAAAAAIAAAAAAANmAADAAAAAEAAAAM2ABqrkUHWLIjutmwT8aSwAAAAABIAAAKAAAAAQAAAAB++4pk2c38nl+B8CQ1xQ8lAAAACDTggVTXdcei1dA4QpS2EM3j9zDxuLROzPcF+VlD3TOHucdUilnfVGiFgRj6oDphatETwcwgkP+xXB4TixbYvDp90yn7ajFFbVBH41sxK+ExQAAADnUwPj8oZDOcsaCAlZ2Clo8VQMmw==";
5
+ exports.item1Path = "customXml/item1.xml";
6
+ exports.item2Path = "customXml/item2.xml";
7
+ exports.relationshipInfo = `s{"columnCount":1,"keyColumnNames":[],"queryRelationships":[],"columnIdentities":["Section1/newQueryName/AutoRemovedColumns1.{newQueryName,0}"],"ColumnCount":1,"KeyColumnNames":[],"ColumnIdentities":["Section1/newQueryName/AutoRemovedColumns1.{newQueryName,0}"],"RelationshipInfo":[]}`;
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.addZeroSheetsXmlMock = exports.queryTableMock = exports.workbookXmlMock = exports.sheetsXmlMock = exports.existingSharedStringsXmlMock = exports.pqMetadataXmlMockPart2 = exports.pqMetadataXmlMockPart1 = exports.sharedStringsXmlMock = exports.connectedWorkbookXmlMock = exports.relationshipInfo = exports.item2Path = exports.item1Path = exports.pqEmptySingleQueryBase64 = exports.section1mNewQueryNameBlankMock = exports.section1mNewQueryNameSimpleMock = exports.section1mBlankQueryMock = exports.section1mSimpleQueryMock = exports.simpleQueryMock = void 0;
4
+ var section1mSimpleQueryMock_1 = require("./section1mSimpleQueryMock");
5
+ Object.defineProperty(exports, "simpleQueryMock", { enumerable: true, get: function () { return section1mSimpleQueryMock_1.simpleQueryMock; } });
6
+ Object.defineProperty(exports, "section1mSimpleQueryMock", { enumerable: true, get: function () { return section1mSimpleQueryMock_1.section1mSimpleQueryMock; } });
7
+ Object.defineProperty(exports, "section1mBlankQueryMock", { enumerable: true, get: function () { return section1mSimpleQueryMock_1.section1mBlankQueryMock; } });
8
+ Object.defineProperty(exports, "section1mNewQueryNameSimpleMock", { enumerable: true, get: function () { return section1mSimpleQueryMock_1.section1mNewQueryNameSimpleMock; } });
9
+ Object.defineProperty(exports, "section1mNewQueryNameBlankMock", { enumerable: true, get: function () { return section1mSimpleQueryMock_1.section1mNewQueryNameBlankMock; } });
10
+ var PqMock_1 = require("./PqMock");
11
+ Object.defineProperty(exports, "pqEmptySingleQueryBase64", { enumerable: true, get: function () { return PqMock_1.pqEmptySingleQueryBase64; } });
12
+ Object.defineProperty(exports, "item1Path", { enumerable: true, get: function () { return PqMock_1.item1Path; } });
13
+ Object.defineProperty(exports, "item2Path", { enumerable: true, get: function () { return PqMock_1.item2Path; } });
14
+ Object.defineProperty(exports, "relationshipInfo", { enumerable: true, get: function () { return PqMock_1.relationshipInfo; } });
15
+ var xmlMocks_1 = require("./xmlMocks");
16
+ Object.defineProperty(exports, "connectedWorkbookXmlMock", { enumerable: true, get: function () { return xmlMocks_1.connectedWorkbookXmlMock; } });
17
+ Object.defineProperty(exports, "sharedStringsXmlMock", { enumerable: true, get: function () { return xmlMocks_1.sharedStringsXmlMock; } });
18
+ Object.defineProperty(exports, "pqMetadataXmlMockPart1", { enumerable: true, get: function () { return xmlMocks_1.pqMetadataXmlMockPart1; } });
19
+ Object.defineProperty(exports, "pqMetadataXmlMockPart2", { enumerable: true, get: function () { return xmlMocks_1.pqMetadataXmlMockPart2; } });
20
+ Object.defineProperty(exports, "existingSharedStringsXmlMock", { enumerable: true, get: function () { return xmlMocks_1.existingSharedStringsXmlMock; } });
21
+ Object.defineProperty(exports, "sheetsXmlMock", { enumerable: true, get: function () { return xmlMocks_1.sheetsXmlMock; } });
22
+ Object.defineProperty(exports, "workbookXmlMock", { enumerable: true, get: function () { return xmlMocks_1.workbookXmlMock; } });
23
+ Object.defineProperty(exports, "queryTableMock", { enumerable: true, get: function () { return xmlMocks_1.queryTableMock; } });
24
+ Object.defineProperty(exports, "addZeroSheetsXmlMock", { enumerable: true, get: function () { return xmlMocks_1.addZeroSheetsXmlMock; } });
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.section1mNewQueryNameBlankMock = exports.section1mNewQueryNameSimpleMock = exports.section1mBlankQueryMock = exports.section1mSimpleQueryMock = exports.simpleQueryMock = void 0;
4
+ exports.simpleQueryMock = `shared newQueryName =
5
+ let
6
+ Source = Folder.Files("C:\\Users\\user1\\Desktop\\test")
7
+ in
8
+ Source`;
9
+ exports.section1mSimpleQueryMock = `section Section1;
10
+
11
+ shared Query1 =
12
+ ${exports.simpleQueryMock};`;
13
+ exports.section1mBlankQueryMock = `section Section1;\r\n\r\nshared Query1 = let\r\n Source = ""\r\nin\r\n Source;`;
14
+ exports.section1mNewQueryNameSimpleMock = `section Section1;
15
+
16
+ shared newQueryName =
17
+ ${exports.simpleQueryMock};`;
18
+ exports.section1mNewQueryNameBlankMock = `section Section1;\r\n\r\nshared newQueryName = let\r\n Source = ""\r\nin\r\n Source;`;
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.pqMetadataXmlMockPart2 = exports.pqMetadataXmlMockPart1 = exports.existingSharedStringsXmlMock = exports.sharedStringsXmlMock = exports.queryTableMock = exports.workbookXmlMock = exports.addZeroSheetsXmlMock = exports.sheetsXmlMock = exports.connectedWorkbookXmlMock = void 0;
4
+ exports.connectedWorkbookXmlMock = '<?xml version="1.0" encoding="utf-8"?><ConnectedWorkbook xmlns="http://schemas.microsoft.com/ConnectedWorkbook" version="1.0.0"></ConnectedWorkbook>';
5
+ exports.sheetsXmlMock = '<sheetData><row r="1" spans="1:2" x14ac:dyDescent="0.3"><c r="A1" t="str"><v>Column1</v></c><c r="B1" t="str"><v>Column2</v></c></row><row r="2" spans="1:2" x14ac:dyDescent="0.3"><c r="A2" t="1"><v>1</v></c><c r="B2" t="1"><v>2</v></c></row></sheetData>';
6
+ exports.addZeroSheetsXmlMock = '<sheetData><row r="1" spans="1:2" x14ac:dyDescent="0.3"><c r="A1" t="str"><v>Column1</v></c><c r="B1" t="str"><v>Column2</v></c></row><row r="2" spans="1:2" x14ac:dyDescent="0.3"><c r="A2" t="str"><v>one</v></c><c r="B2" t="1"><v>0</v></c></row><row r="3" spans="1:2" x14ac:dyDescent="0.3"><c r="A3" t="str"><v>two</v></c><c r="B3" t="1"><v>2</v></c></row></sheetData>';
7
+ exports.workbookXmlMock = '<definedName name="ExternalData_1" localSheetId="0" hidden="1">Sheet1!$A$1:$B$2</definedName>';
8
+ exports.queryTableMock = '<queryTableRefresh nextId="3"><queryTableFields count="2"><queryTableField id="1" name="Column1" tableColumnId="1"/><queryTableField id="2" name="Column2" tableColumnId="2"/></queryTableFields></queryTableRefresh></queryTable>';
9
+ exports.sharedStringsXmlMock = `<sst xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" count="2" uniqueCount="2"><si><t>Query1</t></si><si><t/></si><si><t>newQueryName</t></si></sst>`;
10
+ exports.existingSharedStringsXmlMock = `<sst xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" count="1" uniqueCount="1"><si><t>newQueryName</t></si><si><t/></si></sst>`;
11
+ exports.pqMetadataXmlMockPart1 = '<LocalPackageMetadataFile xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><Items> <Item> <ItemLocation> <ItemType>AllFormulas</ItemType> <ItemPath/> </ItemLocation> <StableEntries/> </Item> <Item> <ItemLocation> <ItemType>Formula</ItemType> <ItemPath>Section1/newQueryName</ItemPath> </ItemLocation> <StableEntries> <Entry Type="IsPrivate" Value="l0"/> <Entry Type="FillEnabled" Value="l1"/> <Entry Type="FillObjectType" Value="sTable"/> <Entry Type="FillToDataModelEnabled" Value="l0"/> <Entry Type="BufferNextRefresh" Value="l1"/> <Entry Type="ResultType" Value="sTable"/> <Entry Type="NameUpdatedAfterFill" Value="l0"/> <Entry Type="NavigationStepName" Value="sNavigation"/> <Entry Type="FillTarget" Value="sQuery1"/> <Entry Type="FilledCompleteResultToWorksheet" Value="l1"/> <Entry Type="AddedToDataModel" Value="l0"/> <Entry Type="FillCount" Value="l1"/> <Entry Type="FillErrorCode" Value="sUnknown"/> <Entry Type="FillErrorCount" Value="l0"/>';
12
+ exports.pqMetadataXmlMockPart2 = '<Entry Type="FillColumnTypes" Value="sBg=="/> <Entry Type="FillColumnNames" Value="s[&quot;Query1&quot;]"/> <Entry Type="FillStatus" Value="sComplete"/> <Entry Type="RelationshipInfoContainer" Value="s{&quot;columnCount&quot;:1,&quot;keyColumnNames&quot;:[],&quot;queryRelationships&quot;:[],&quot;columnIdentities&quot;:[&quot;Section1/Query1/AutoRemovedColumns1.{Query1,0}&quot;],&quot;ColumnCount&quot;:1,&quot;KeyColumnNames&quot;:[],&quot;ColumnIdentities&quot;:[&quot;Section1/Query1/AutoRemovedColumns1.{Query1,0}&quot;],&quot;RelationshipInfo&quot;:[]}"/> </StableEntries> </Item> <Item> <ItemLocation> <ItemType>Formula</ItemType> <ItemPath>Section1/newQueryName/Source</ItemPath> </ItemLocation> <StableEntries/> </Item> </Items> </LocalPackageMetadataFile>';
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ // Copyright (c) Microsoft Corporation.
3
+ // Licensed under the MIT license.
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ const utils_1 = require("../src/utils");
6
+ const mocks_1 = require("./mocks");
7
+ describe("Table Utils tests", () => {
8
+ test("tests workbookXML contains initial data dimensions", () => {
9
+ const defaultString = '<workbook xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="x15 xr xr6 xr10 xr2" xmlns:x15="http://schemas.microsoft.com/office/spreadsheetml/2010/11/main" xmlns:xr="http://schemas.microsoft.com/office/spreadsheetml/2014/revision" xmlns:xr6="http://schemas.microsoft.com/office/spreadsheetml/2016/revision6" xmlns:xr10="http://schemas.microsoft.com/office/spreadsheetml/2016/revision10" xmlns:xr2="http://schemas.microsoft.com/office/spreadsheetml/2015/revision2"><fileVersion appName="xl" lastEdited="7" lowestEdited="7" rupBuild="24729"/><workbookPr codeName="ThisWorkbook" defaultThemeVersion="166925"/><mc:AlternateContent><mc:Choice Requires="x15"><x15ac:absPath url="C:Usersv-ahmadsbeihDesktop" xmlns:x15ac="http://schemas.microsoft.com/office/spreadsheetml/2010/11/ac"/></mc:Choice></mc:AlternateContent><xr:revisionPtr revIDLastSave="0" documentId="13_ncr:1_{93EF201C-7856-4B60-94D4-65DDB8F3F16A}" xr6:coauthVersionLast="47" xr6:coauthVersionMax="47" xr10:uidLastSave="{00000000-0000-0000-0000-000000000000}"/><bookViews><workbookView xWindow="28680" yWindow="-120" windowWidth="29040" windowHeight="15990" xr2:uid="{DB915CB9-8DD9-492A-A471-C61E61200113}"/></bookViews><sheets><sheet name="Query1" sheetId="2" r:id="rId1"/><sheet name="Sheet1" sheetId="1" r:id="rId2"/></sheets><definedNames><definedName name="ExternalData_1" localSheetId="0" hidden="1">Sheet1!$A$1:$B$2</definedName></definedNames><calcPr calcId="191029"/><extLst><ext uri="{140A7094-0E35-4892-8432-C4D2E57EDEB5}"><x15:workbookPr chartTrackingRefBase="1"/></ext><ext uri="{B58B0392-4F1F-4190-BB64-5DF3571DCE5F}" xmlns:xcalcf="http://schemas.microsoft.com/office/spreadsheetml/2018/calcfeatures"><xcalcf:calcFeatures><xcalcf:feature name="microsoft.com:RD"/><xcalcf:feature name="microsoft.com:FV"/><xcalcf:feature name="microsoft.com:LET_WF"/><xcalcf:feature name="microsoft.com:LAMBDA_WF"/></xcalcf:calcFeatures></ext></extLst></workbook>';
10
+ const worksheetXml = utils_1.tableUtils.updateWorkbookInitialData(defaultString, {
11
+ columnNames: ["Column1", "Column2"],
12
+ rows: [["1", "2"]],
13
+ });
14
+ expect(worksheetXml).toContain(mocks_1.workbookXmlMock);
15
+ });
16
+ test("tests Pivot Tables contain initial data", () => {
17
+ const defaultString = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\r\n<table xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="xr xr3" xmlns:xr="http://schemas.microsoft.com/office/spreadsheetml/2014/revision" xmlns:xr3="http://schemas.microsoft.com/office/spreadsheetml/2016/revision3" id="1" xr:uid="{D8539CF6-04E5-464D-9950-5A36C5A1FCFE}" name="Query1" displayName="Query1" ref="A1:A2" tableType="queryTable" totalsRowShown="0"><autoFilter ref="A1:A2" xr:uid="{D8539CF6-04E5-464D-9950-5A36C5A1FCFE}"/><tableColumns count="1"><tableColumn id="1" xr3:uid="{D1084858-8AE5-4728-A9BE-FE78821CDFFF}" uniqueName="1" name="Query1" queryTableFieldId="1" dataDxfId="0"/></tableColumns><tableStyleInfo name="TableStyleMedium7" showFirstColumn="0" showLastColumn="0" showRowStripes="1" showColumnStripes="0"/></table>';
18
+ const tableXmlSheet = utils_1.tableUtils.updateTablesInitialData(defaultString, {
19
+ columnNames: ["Column1", "Column2"],
20
+ rows: [["1", "2"]],
21
+ }, true);
22
+ expect(tableXmlSheet).toContain('count="2"');
23
+ expect(tableXmlSheet).toContain('ref="A1:B2');
24
+ expect(tableXmlSheet).toContain('uniqueName="1"');
25
+ expect(tableXmlSheet).toContain('name="Column1"');
26
+ expect(tableXmlSheet).toContain('queryTableFieldId="1"');
27
+ expect(tableXmlSheet).toContain('uniqueName="2"');
28
+ expect(tableXmlSheet).toContain('name="Column2"');
29
+ expect(tableXmlSheet).toContain('queryTableFieldId="2"');
30
+ });
31
+ test("tests blank Table contain initial data", () => {
32
+ const defaultString = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\r\n<table xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="xr xr3" xmlns:xr="http://schemas.microsoft.com/office/spreadsheetml/2014/revision" xmlns:xr3="http://schemas.microsoft.com/office/spreadsheetml/2016/revision3" id="1" xr:uid="{D8539CF6-04E5-464D-9950-5A36C5A1FCFE}" name="Query1" displayName="Query1" ref="A1:A2" tableType="queryTable" totalsRowShown="0"><autoFilter ref="A1:A2" xr:uid="{D8539CF6-04E5-464D-9950-5A36C5A1FCFE}"/><tableColumns count="1"><tableColumn id="1" xr3:uid="{D1084858-8AE5-4728-A9BE-FE78821CDFFF}" uniqueName="1" name="Query1" queryTableFieldId="1" dataDxfId="0"/></tableColumns><tableStyleInfo name="TableStyleMedium7" showFirstColumn="0" showLastColumn="0" showRowStripes="1" showColumnStripes="0"/></table>';
33
+ const tableXmlSheet = utils_1.tableUtils.updateTablesInitialData(defaultString, {
34
+ columnNames: ["Column1", "Column2"],
35
+ rows: [["1", "2"]],
36
+ }, false);
37
+ expect(tableXmlSheet).toContain('count="2"');
38
+ expect(tableXmlSheet).toContain('ref="A1:B2');
39
+ expect(tableXmlSheet).toContain('name="Column2"');
40
+ expect(tableXmlSheet).toContain('name="Column1"');
41
+ // Not contains query table metadata.
42
+ expect(tableXmlSheet).not.toContain('uniqueName="1"');
43
+ expect(tableXmlSheet).not.toContain('queryTableFieldId="1"');
44
+ expect(tableXmlSheet).not.toContain('uniqueName="2"');
45
+ expect(tableXmlSheet).not.toContain('queryTableFieldId="2"');
46
+ });
47
+ test("test valid initial data in SheetsXML", () => {
48
+ const defaultString = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?><worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="x14ac xr xr2 xr3" xmlns:x14ac="http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac" xmlns:xr="http://schemas.microsoft.com/office/spreadsheetml/2014/revision" xmlns:xr2="http://schemas.microsoft.com/office/spreadsheetml/2015/revision2" xmlns:xr3="http://schemas.microsoft.com/office/spreadsheetml/2016/revision3" xr:uid="{EDF0138E-D216-4CD1-8EFA-1396A1BB4478}"><sheetPr codeName="Sheet1"/><dimension ref="A1:B2"/><sheetViews><sheetView tabSelected="1" workbookViewId="0"><selection sqref="A1:B2"/></sheetView></sheetViews><sheetFormatPr defaultRowHeight="14.4" x14ac:dyDescent="0.3"/><cols><col min="1" max="1" width="9.6640625" bestFit="1" customWidth="1"/></cols><sheetData><row r="1" spans="1:1" x14ac:dyDescent="0.3"><c r="A1" t="s"><v>0</v></c></row><row r="2" spans="1:1" x14ac:dyDescent="0.3"><c r="A2" t="s"><v>1</v></c></row></sheetData><pageMargins left="0.7" right="0.7" top="0.75" bottom="0.75" header="0.3" footer="0.3"/><tableParts count="1"><tablePart r:id="rId1"/></tableParts></worksheet>';
49
+ const sheetsXmlString = utils_1.tableUtils.updateSheetsInitialData(defaultString, {
50
+ columnNames: ["Column1", "Column2"],
51
+ rows: [["1", "2"]],
52
+ });
53
+ expect(sheetsXmlString).toContain(mocks_1.sheetsXmlMock);
54
+ });
55
+ test("tests Query Tables contain initial data", () => {
56
+ const defaultString = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\r\n<queryTable xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="xr16" xmlns:xr16="http://schemas.microsoft.com/office/spreadsheetml/2017/revision16" name="ExternalData_1" connectionId="1" xr16:uid="{24C17B89-3CD3-4AA5-B84F-9FF5F35245D7}" autoFormatId="16" applyNumberFormats="0" applyBorderFormats="0" applyFontFormats="0" applyPatternFormats="0" applyAlignmentFormats="0" applyWidthHeightFormats="0"><queryTableRefresh nextId="2"><queryTableFields count="1"><queryTableField id="1" name="Query1" tableColumnId="1"/></queryTableFields></queryTableRefresh></queryTable>';
57
+ const queryTableXmlSheet = utils_1.tableUtils.updateQueryTablesInitialData(defaultString, {
58
+ columnNames: ["Column1", "Column2"],
59
+ rows: [["1", "2"]],
60
+ });
61
+ expect(queryTableXmlSheet).toContain(mocks_1.queryTableMock);
62
+ });
63
+ });
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+ // Copyright (c) Microsoft Corporation.
3
+ // Licensed under the MIT license.
4
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
5
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
6
+ return new (P || (P = Promise))(function (resolve, reject) {
7
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
8
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
9
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
10
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
11
+ });
12
+ };
13
+ var __importDefault = (this && this.__importDefault) || function (mod) {
14
+ return (mod && mod.__esModule) ? mod : { "default": mod };
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ const utils_1 = require("../src/utils");
18
+ const constants_1 = require("../src/utils/constants");
19
+ const mashupDocumentParser_1 = require("../src/utils/mashupDocumentParser");
20
+ const workbookTemplate_1 = require("../src/workbookTemplate");
21
+ const mocks_1 = require("./mocks");
22
+ const jszip_1 = __importDefault(require("jszip"));
23
+ const getZip = (template) => __awaiter(void 0, void 0, void 0, function* () {
24
+ return yield jszip_1.default.loadAsync(template, {
25
+ base64: true,
26
+ });
27
+ });
28
+ describe("Single query template tests", () => {
29
+ const singleQueryDefaultTemplate = workbookTemplate_1.SIMPLE_QUERY_WORKBOOK_TEMPLATE;
30
+ let defaultZipFile;
31
+ beforeAll(() => __awaiter(void 0, void 0, void 0, function* () {
32
+ expect(() => __awaiter(void 0, void 0, void 0, function* () { return yield getZip(singleQueryDefaultTemplate); })).not.toThrow();
33
+ defaultZipFile = yield getZip(singleQueryDefaultTemplate);
34
+ }));
35
+ test("Default template is a valid zip file", () => __awaiter(void 0, void 0, void 0, function* () {
36
+ expect(defaultZipFile).toBeTruthy();
37
+ }));
38
+ test("DataMashup XML exists, and valid PQ Base64 can be extracted", () => __awaiter(void 0, void 0, void 0, function* () {
39
+ expect(() => __awaiter(void 0, void 0, void 0, function* () { return yield utils_1.pqUtils.getDataMashupFile(defaultZipFile); })).not.toThrowError();
40
+ const { found, path, value } = yield utils_1.pqUtils.getDataMashupFile(defaultZipFile);
41
+ expect(found).toBeTruthy();
42
+ expect(value).toEqual(mocks_1.pqEmptySingleQueryBase64);
43
+ expect(path).toEqual(mocks_1.item1Path);
44
+ }));
45
+ test("ConnectedWorkbook XML exists as item1.xml", () => __awaiter(void 0, void 0, void 0, function* () {
46
+ const { found, path, xmlString } = yield utils_1.pqUtils.getCustomXmlFile(defaultZipFile, constants_1.URLS.CONNECTED_WORKBOOK, "utf-8");
47
+ expect(found).toBeTruthy();
48
+ expect(xmlString).toEqual(mocks_1.connectedWorkbookXmlMock);
49
+ expect(path).toEqual(mocks_1.item2Path);
50
+ }));
51
+ test("A single blank query named Query1 exists", () => __awaiter(void 0, void 0, void 0, function* () {
52
+ var _a;
53
+ const base64Str = yield utils_1.pqUtils.getBase64(defaultZipFile);
54
+ const { packageOPC } = (0, mashupDocumentParser_1.getPackageComponents)(base64Str);
55
+ const packageZip = yield jszip_1.default.loadAsync(packageOPC);
56
+ const section1m = yield ((_a = packageZip.file(constants_1.section1mPath)) === null || _a === void 0 ? void 0 : _a.async(constants_1.textResultType));
57
+ if (section1m == undefined) {
58
+ throw new Error("section1m is undefined");
59
+ }
60
+ const hasQuery1 = section1m.includes("Query1");
61
+ expect(hasQuery1).toBeTruthy();
62
+ expect(section1m).toEqual(mocks_1.section1mBlankQueryMock);
63
+ }));
64
+ });
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ // Copyright (c) Microsoft Corporation.
3
+ // Licensed under the MIT license.
4
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
5
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
6
+ return new (P || (P = Promise))(function (resolve, reject) {
7
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
8
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
9
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
10
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
11
+ });
12
+ };
13
+ var __importDefault = (this && this.__importDefault) || function (mod) {
14
+ return (mod && mod.__esModule) ? mod : { "default": mod };
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ const workbookTemplate_1 = require("../src/workbookTemplate");
18
+ const utils_1 = require("../src/utils");
19
+ const constants_1 = require("../src/utils/constants");
20
+ const jszip_1 = __importDefault(require("jszip"));
21
+ const getZip = (template) => __awaiter(void 0, void 0, void 0, function* () {
22
+ return yield jszip_1.default.loadAsync(template, {
23
+ base64: true,
24
+ });
25
+ });
26
+ describe("Single blank table template tests", () => {
27
+ const simpleTableDefaultTemplate = workbookTemplate_1.SIMPLE_BLANK_TABLE_TEMPLATE;
28
+ let defaultZipFile;
29
+ beforeAll(() => __awaiter(void 0, void 0, void 0, function* () {
30
+ expect(() => __awaiter(void 0, void 0, void 0, function* () { return yield getZip(simpleTableDefaultTemplate); })).not.toThrow();
31
+ defaultZipFile = yield getZip(simpleTableDefaultTemplate);
32
+ }));
33
+ test("Default template is a valid zip file", () => {
34
+ expect(defaultZipFile).toBeTruthy();
35
+ });
36
+ test("DataMashup XML doesn't exists", () => __awaiter(void 0, void 0, void 0, function* () {
37
+ try {
38
+ yield utils_1.pqUtils.getDataMashupFile(defaultZipFile);
39
+ }
40
+ catch (error) {
41
+ expect(error).toBeTruthy();
42
+ }
43
+ }));
44
+ test("A single blank table exists", () => __awaiter(void 0, void 0, void 0, function* () {
45
+ var _a;
46
+ const tableXml = yield ((_a = defaultZipFile.file(constants_1.tableXmlPath)) === null || _a === void 0 ? void 0 : _a.async(constants_1.textResultType));
47
+ expect(tableXml).toContain('name="Table1" displayName="Table1" ref="A1:A2"');
48
+ }));
49
+ test("Does not contains query table", () => __awaiter(void 0, void 0, void 0, function* () {
50
+ var _b;
51
+ const queryTableXml = yield ((_b = defaultZipFile.file(constants_1.queryTableXmlPath)) === null || _b === void 0 ? void 0 : _b.async(constants_1.textResultType));
52
+ expect(queryTableXml).toBeFalsy();
53
+ }));
54
+ });