@intuned/browser-dev 0.1.4-dev.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.
- package/.babelrc +21 -0
- package/.eslintignore +10 -0
- package/.eslintrc.js +39 -0
- package/BROWSER_SCRIPTS_SETUP.md +84 -0
- package/LICENSE +43 -0
- package/README.md +160 -0
- package/RELEASE.md +60 -0
- package/dist/ai/export.d.js +5 -0
- package/dist/ai/export.d.ts +641 -0
- package/dist/ai/extractStructuredData.js +320 -0
- package/dist/ai/extractStructuredDataUsingAi.js +142 -0
- package/dist/ai/extractionHelpers/screenshotHelpers.js +56 -0
- package/dist/ai/extractionHelpers/validateSchema.js +148 -0
- package/dist/ai/index.d.ts +641 -0
- package/dist/ai/index.js +19 -0
- package/dist/ai/isPageLoaded.js +80 -0
- package/dist/ai/prompt.js +39 -0
- package/dist/ai/tests/testCheckAllTypesAreStrings.spec.js +137 -0
- package/dist/ai/tests/testExtractFromContent.spec.js +372 -0
- package/dist/ai/tests/testExtractStructuredData.spec.js +646 -0
- package/dist/ai/tests/testIsPageLoaded.spec.js +277 -0
- package/dist/ai/tools/index.js +48 -0
- package/dist/ai/types/errors.js +67 -0
- package/dist/ai/types/models.js +45 -0
- package/dist/ai/types/types.js +48 -0
- package/dist/ai/validators.js +167 -0
- package/dist/common/Logger/index.js +60 -0
- package/dist/common/Logger/types.js +5 -0
- package/dist/common/SdkError.js +50 -0
- package/dist/common/aiModelsValidations.js +32 -0
- package/dist/common/ensureBrowserScripts.js +14 -0
- package/dist/common/extendedTest.js +157 -0
- package/dist/common/extractionHelpers.js +19 -0
- package/dist/common/formatZodError.js +18 -0
- package/dist/common/fuzzySearch/fuzzySearch.test.js +250 -0
- package/dist/common/fuzzySearch/levenshtein-search.js +298 -0
- package/dist/common/fuzzySearch/utils.js +23 -0
- package/dist/common/getModelProvider.js +18 -0
- package/dist/common/getSimplifiedHtml.js +122 -0
- package/dist/common/hashObject.js +32 -0
- package/dist/common/html2markdown/convertElementToMarkdown.js +469 -0
- package/dist/common/html2markdown/index.js +19 -0
- package/dist/common/jwtTokenManager.js +57 -0
- package/dist/common/loadRuntime.js +16 -0
- package/dist/common/locatorHelpers.js +41 -0
- package/dist/common/matching/collectStrings.js +32 -0
- package/dist/common/matching/levenshtein.js +40 -0
- package/dist/common/matching/matching.js +317 -0
- package/dist/common/matching/types.js +1 -0
- package/dist/common/noEmpty.js +9 -0
- package/dist/common/saveSnapshotWithExamples.js +60 -0
- package/dist/common/script.js +2602 -0
- package/dist/common/tests/testEnsureBrowserScript.spec.js +31 -0
- package/dist/common/xpathMapping.js +107 -0
- package/dist/helpers/clickUntilExhausted.js +85 -0
- package/dist/helpers/downloadFile.js +125 -0
- package/dist/helpers/export.d.js +5 -0
- package/dist/helpers/export.d.ts +1220 -0
- package/dist/helpers/extractMarkdown.js +35 -0
- package/dist/helpers/filterEmptyValues.js +54 -0
- package/dist/helpers/gotoUrl.js +98 -0
- package/dist/helpers/index.d.ts +1220 -0
- package/dist/helpers/index.js +122 -0
- package/dist/helpers/processDate.js +25 -0
- package/dist/helpers/resolveUrl.js +64 -0
- package/dist/helpers/sanitizeHtml.js +74 -0
- package/dist/helpers/saveFileToS3.js +50 -0
- package/dist/helpers/scrollToLoadContent.js +57 -0
- package/dist/helpers/tests/testClickUntilExhausted.spec.js +372 -0
- package/dist/helpers/tests/testDownloadFile.spec.js +206 -0
- package/dist/helpers/tests/testExtractMarkdown.spec.js +290 -0
- package/dist/helpers/tests/testFilterEmptyValues.spec.js +151 -0
- package/dist/helpers/tests/testGoToUrl.spec.js +37 -0
- package/dist/helpers/tests/testProcessDate.spec.js +13 -0
- package/dist/helpers/tests/testResolveUrl.spec.js +341 -0
- package/dist/helpers/tests/testSanitizeHtml.spec.js +330 -0
- package/dist/helpers/tests/testScrollToLoadContent.spec.js +163 -0
- package/dist/helpers/tests/testValidateDataUsingSchema.spec.js +342 -0
- package/dist/helpers/tests/testWithDomSettledWait.spec.js +164 -0
- package/dist/helpers/tests/testWithNetworkIdleWait.spec.js +114 -0
- package/dist/helpers/types/Attachment.js +115 -0
- package/dist/helpers/types/CustomTypeRegistry.js +48 -0
- package/dist/helpers/types/RunEnvironment.js +18 -0
- package/dist/helpers/types/ValidationError.js +17 -0
- package/dist/helpers/types/index.js +51 -0
- package/dist/helpers/uploadFileToS3.js +154 -0
- package/dist/helpers/utils/getS3Client.js +22 -0
- package/dist/helpers/utils/index.js +73 -0
- package/dist/helpers/utils/isDownload.js +10 -0
- package/dist/helpers/utils/isGenerateCodeMode.js +9 -0
- package/dist/helpers/utils/isLocator.js +9 -0
- package/dist/helpers/utils/jwtTokenManager.js +18 -0
- package/dist/helpers/validateDataUsingSchema.js +103 -0
- package/dist/helpers/waitForDomSettled.js +90 -0
- package/dist/helpers/withNetworkSettledWait.js +91 -0
- package/dist/index.d.js +16 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.js +16 -0
- package/dist/intunedServices/ApiGateway/aiApiGateway.js +143 -0
- package/dist/intunedServices/ApiGateway/factory.js +16 -0
- package/dist/intunedServices/ApiGateway/providers/Anthropic.js +26 -0
- package/dist/intunedServices/ApiGateway/providers/Gemini.js +29 -0
- package/dist/intunedServices/ApiGateway/providers/OpenAI.js +29 -0
- package/dist/intunedServices/ApiGateway/tests/testApiGateway.spec.js +355 -0
- package/dist/intunedServices/ApiGateway/types.js +11 -0
- package/dist/intunedServices/cache/cache.js +61 -0
- package/dist/intunedServices/cache/index.js +12 -0
- package/dist/intunedServices/cache/tests/testCache.spec.js +117 -0
- package/dist/optimized-extractors/common/buildExamplesPrompt.js +12 -0
- package/dist/optimized-extractors/common/buildImagesFromPage.js +55 -0
- package/dist/optimized-extractors/common/extractStructuredDataUsingClaude.js +135 -0
- package/dist/optimized-extractors/common/extractStructuredDataUsingGoogle.js +37 -0
- package/dist/optimized-extractors/common/extractStructuredDataUsingOpenAi.js +132 -0
- package/dist/optimized-extractors/common/extractStrucutredDataUsingAiInstance.js +122 -0
- package/dist/optimized-extractors/common/findTableHeaders.js +162 -0
- package/dist/optimized-extractors/common/index.js +55 -0
- package/dist/optimized-extractors/common/isTableHeaderOrFooter.js +84 -0
- package/dist/optimized-extractors/common/matching/matching.js +212 -0
- package/dist/optimized-extractors/common/matching/matching.test.js +655 -0
- package/dist/optimized-extractors/common/matching/types.js +18 -0
- package/dist/optimized-extractors/common/matching/utils.js +184 -0
- package/dist/optimized-extractors/common/utils.js +58 -0
- package/dist/optimized-extractors/export.d.js +5 -0
- package/dist/optimized-extractors/export.d.ts +397 -0
- package/dist/optimized-extractors/extractArray.js +120 -0
- package/dist/optimized-extractors/extractObject.js +104 -0
- package/dist/optimized-extractors/index.d.ts +397 -0
- package/dist/optimized-extractors/index.js +31 -0
- package/dist/optimized-extractors/listExtractionHelpers/__tests__/dynamicListExtractor.spec.js +269 -0
- package/dist/optimized-extractors/listExtractionHelpers/__tests__/findSetOfXpathsToCreateAnArrayExtractor.test.js +22 -0
- package/dist/optimized-extractors/listExtractionHelpers/__tests__/getContainerElement.test.js +21 -0
- package/dist/optimized-extractors/listExtractionHelpers/__tests__/partOfSameArrayXpath.test.js +42 -0
- package/dist/optimized-extractors/listExtractionHelpers/__tests__/testArrayExtractorFromLocator.spec.js +146 -0
- package/dist/optimized-extractors/listExtractionHelpers/__tests__/testArrayExtractorFromPage.spec.js +130 -0
- package/dist/optimized-extractors/listExtractionHelpers/__tests__/verifyThatAllXpathsArePartOfSameArray.test.js +9 -0
- package/dist/optimized-extractors/listExtractionHelpers/dynamicListExtractor.js +160 -0
- package/dist/optimized-extractors/listExtractionHelpers/errors.js +46 -0
- package/dist/optimized-extractors/listExtractionHelpers/getListMatches.js +14 -0
- package/dist/optimized-extractors/listExtractionHelpers/runAiExtraction.js +243 -0
- package/dist/optimized-extractors/listExtractionHelpers/typesAndSchema.js +5 -0
- package/dist/optimized-extractors/listExtractionHelpers/utils/extractPropertiesUsingGPTFromArray.js +277 -0
- package/dist/optimized-extractors/listExtractionHelpers/utils/extractStructuredListUsingAi.js +44 -0
- package/dist/optimized-extractors/listExtractionHelpers/utils/getListContainerXpath.js +94 -0
- package/dist/optimized-extractors/listExtractionHelpers/utils/getRelativeContainerXpathSelector.js +20 -0
- package/dist/optimized-extractors/listExtractionHelpers/utils/getSimplifiedHtmlPerListItem.js +21 -0
- package/dist/optimized-extractors/listExtractionHelpers/utils/tablesUtils.js +48 -0
- package/dist/optimized-extractors/listExtractionHelpers/utils/validateOptions.js +52 -0
- package/dist/optimized-extractors/models/anthropicModel.js +23 -0
- package/dist/optimized-extractors/models/openaiModel.js +23 -0
- package/dist/optimized-extractors/objectExtractionHelpers/AIExtractors.js +73 -0
- package/dist/optimized-extractors/objectExtractionHelpers/__tests__/checksumUtils.test.js +103 -0
- package/dist/optimized-extractors/objectExtractionHelpers/__tests__/testObjectExtractorFromLocator.spec.js +107 -0
- package/dist/optimized-extractors/objectExtractionHelpers/__tests__/testObjectExtractorFromPage.spec.js +107 -0
- package/dist/optimized-extractors/objectExtractionHelpers/calculateObjectExampleHash.js +28 -0
- package/dist/optimized-extractors/objectExtractionHelpers/captureSnapshot.js +26 -0
- package/dist/optimized-extractors/objectExtractionHelpers/checksumUtils.js +32 -0
- package/dist/optimized-extractors/objectExtractionHelpers/constants.js +7 -0
- package/dist/optimized-extractors/objectExtractionHelpers/dynamicObjectExtractor.js +106 -0
- package/dist/optimized-extractors/objectExtractionHelpers/errors.js +42 -0
- package/dist/optimized-extractors/objectExtractionHelpers/findDomMatches.js +54 -0
- package/dist/optimized-extractors/objectExtractionHelpers/getSimplifiedHtml.js +122 -0
- package/dist/optimized-extractors/objectExtractionHelpers/typesAndSchemas.js +5 -0
- package/dist/optimized-extractors/objectExtractionHelpers/validateDynamicObjectExtractorOptions.js +52 -0
- package/dist/optimized-extractors/types/aiModelsValidation.js +45 -0
- package/dist/optimized-extractors/types/errors.js +42 -0
- package/dist/optimized-extractors/types/jsonSchema.d.js +5 -0
- package/dist/optimized-extractors/types/jsonSchema.d.ts +50 -0
- package/dist/optimized-extractors/types/types.js +5 -0
- package/dist/optimized-extractors/validators.js +152 -0
- package/dist/types/intuned-runtime.d.js +1 -0
- package/dist/types/intuned-runtime.d.ts +64 -0
- package/dist/vite-env.d.js +1 -0
- package/dist/vite-env.d.ts +9 -0
- package/generated-docs/ai/functions/extractStructuredData.mdx +255 -0
- package/generated-docs/ai/functions/isPageLoaded.mdx +88 -0
- package/generated-docs/ai/interfaces/ArraySchema.mdx +36 -0
- package/generated-docs/ai/interfaces/BasicSchema.mdx +14 -0
- package/generated-docs/ai/interfaces/BooleanSchema.mdx +28 -0
- package/generated-docs/ai/interfaces/ImageBufferContentItem.mdx +16 -0
- package/generated-docs/ai/interfaces/ImageUrlContentItem.mdx +16 -0
- package/generated-docs/ai/interfaces/NumberSchema.mdx +35 -0
- package/generated-docs/ai/interfaces/ObjectSchema.mdx +39 -0
- package/generated-docs/ai/interfaces/StringSchema.mdx +35 -0
- package/generated-docs/ai/interfaces/TextContentItem.mdx +14 -0
- package/generated-docs/ai/type-aliases/ContentItem.mdx +12 -0
- package/generated-docs/ai/type-aliases/JsonSchema.mdx +47 -0
- package/generated-docs/ai/type-aliases/SUPPORTED_MODELS.mdx +85 -0
- package/generated-docs/helpers/functions/downloadFile.mdx +99 -0
- package/generated-docs/helpers/functions/extractMarkdown.mdx +56 -0
- package/generated-docs/helpers/functions/filterEmptyValues.mdx +51 -0
- package/generated-docs/helpers/functions/goToUrl.mdx +124 -0
- package/generated-docs/helpers/functions/processDate.mdx +55 -0
- package/generated-docs/helpers/functions/resolveUrl.mdx +165 -0
- package/generated-docs/helpers/functions/sanitizeHtml.mdx +113 -0
- package/generated-docs/helpers/functions/saveFileToS3.mdx +127 -0
- package/generated-docs/helpers/functions/scrollToLoadContent.mdx +89 -0
- package/generated-docs/helpers/functions/uploadFileToS3.mdx +121 -0
- package/generated-docs/helpers/functions/validateDataUsingSchema.mdx +90 -0
- package/generated-docs/helpers/functions/waitForDomSettled.mdx +91 -0
- package/generated-docs/helpers/functions/withNetworkSettledWait.mdx +76 -0
- package/generated-docs/helpers/interfaces/Attachment.mdx +56 -0
- package/generated-docs/helpers/interfaces/S3Configs.mdx +52 -0
- package/generated-docs/helpers/interfaces/SanitizeHtmlOptions.mdx +22 -0
- package/generated-docs/helpers/type-aliases/AttachmentType.mdx +10 -0
- package/generated-docs/helpers/type-aliases/FileType.mdx +61 -0
- package/generated-docs/helpers/type-aliases/Trigger.mdx +62 -0
- package/how-to-generate-docs.md +61 -0
- package/how-to-run-tests.md +42 -0
- package/intuned-runtime-setup.md +13 -0
- package/package.json +124 -0
- package/tsconfig.eslint.json +5 -0
- package/tsconfig.json +26 -0
|
@@ -0,0 +1,342 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _types = require("../types");
|
|
4
|
+
var _validateDataUsingSchema = require("../validateDataUsingSchema");
|
|
5
|
+
var _extendedTest = require("../../common/extendedTest");
|
|
6
|
+
(0, _extendedTest.describe)("Data Validation Tests", () => {
|
|
7
|
+
(0, _extendedTest.describe)("validate_data_using_schema function", () => {
|
|
8
|
+
(0, _extendedTest.test)("should validate data using schema with valid data", async () => {
|
|
9
|
+
const schema = {
|
|
10
|
+
type: "object",
|
|
11
|
+
properties: {
|
|
12
|
+
name: {
|
|
13
|
+
type: "string"
|
|
14
|
+
},
|
|
15
|
+
age: {
|
|
16
|
+
type: "integer"
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
required: ["name", "age"]
|
|
20
|
+
};
|
|
21
|
+
const data = {
|
|
22
|
+
name: "John Doe",
|
|
23
|
+
age: 30,
|
|
24
|
+
extra_field: "allowed"
|
|
25
|
+
};
|
|
26
|
+
await (0, _extendedTest.expect)((0, _validateDataUsingSchema.validateDataUsingSchema)({
|
|
27
|
+
data,
|
|
28
|
+
schema
|
|
29
|
+
})).resolves.not.toThrow();
|
|
30
|
+
});
|
|
31
|
+
(0, _extendedTest.test)("should validate data using schema with invalid data (missing required field)", async () => {
|
|
32
|
+
const schema = {
|
|
33
|
+
type: "object",
|
|
34
|
+
properties: {
|
|
35
|
+
name: {
|
|
36
|
+
type: "string"
|
|
37
|
+
},
|
|
38
|
+
age: {
|
|
39
|
+
type: "integer"
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
required: ["name", "age"]
|
|
43
|
+
};
|
|
44
|
+
const invalidData = {
|
|
45
|
+
name: "John Doe"
|
|
46
|
+
};
|
|
47
|
+
await (0, _extendedTest.expect)((0, _validateDataUsingSchema.validateDataUsingSchema)({
|
|
48
|
+
data: invalidData,
|
|
49
|
+
schema
|
|
50
|
+
})).rejects.toThrow(_types.ValidationError);
|
|
51
|
+
try {
|
|
52
|
+
await (0, _validateDataUsingSchema.validateDataUsingSchema)({
|
|
53
|
+
data: invalidData,
|
|
54
|
+
schema
|
|
55
|
+
});
|
|
56
|
+
} catch (error) {
|
|
57
|
+
(0, _extendedTest.expect)(error).toBeInstanceOf(_types.ValidationError);
|
|
58
|
+
(0, _extendedTest.expect)(error.message).toContain("Data validation failed");
|
|
59
|
+
(0, _extendedTest.expect)(error.data).toEqual(invalidData);
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
(0, _extendedTest.test)("should validate data using schema with list of valid objects", async () => {
|
|
63
|
+
const schema = {
|
|
64
|
+
type: "array",
|
|
65
|
+
items: {
|
|
66
|
+
type: "object",
|
|
67
|
+
properties: {
|
|
68
|
+
name: {
|
|
69
|
+
type: "string"
|
|
70
|
+
},
|
|
71
|
+
age: {
|
|
72
|
+
type: "integer"
|
|
73
|
+
}
|
|
74
|
+
},
|
|
75
|
+
required: ["name", "age"]
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
const data = [{
|
|
79
|
+
name: "John Doe",
|
|
80
|
+
age: 30,
|
|
81
|
+
extra: "field"
|
|
82
|
+
}, {
|
|
83
|
+
name: "Jane Doe",
|
|
84
|
+
age: 25,
|
|
85
|
+
other: "value"
|
|
86
|
+
}];
|
|
87
|
+
await (0, _extendedTest.expect)((0, _validateDataUsingSchema.validateDataUsingSchema)({
|
|
88
|
+
data,
|
|
89
|
+
schema
|
|
90
|
+
})).resolves.not.toThrow();
|
|
91
|
+
});
|
|
92
|
+
(0, _extendedTest.test)("should validate data using schema with list containing invalid object", async () => {
|
|
93
|
+
const schema = {
|
|
94
|
+
type: "array",
|
|
95
|
+
items: {
|
|
96
|
+
type: "object",
|
|
97
|
+
properties: {
|
|
98
|
+
name: {
|
|
99
|
+
type: "string"
|
|
100
|
+
},
|
|
101
|
+
age: {
|
|
102
|
+
type: "integer"
|
|
103
|
+
}
|
|
104
|
+
},
|
|
105
|
+
required: ["name", "age"]
|
|
106
|
+
}
|
|
107
|
+
};
|
|
108
|
+
const invalidData = [{
|
|
109
|
+
name: "John Doe",
|
|
110
|
+
age: 30
|
|
111
|
+
}, {
|
|
112
|
+
name: "Jane Doe",
|
|
113
|
+
age: "25"
|
|
114
|
+
}];
|
|
115
|
+
await (0, _extendedTest.expect)((0, _validateDataUsingSchema.validateDataUsingSchema)({
|
|
116
|
+
data: invalidData,
|
|
117
|
+
schema
|
|
118
|
+
})).rejects.toThrow(_types.ValidationError);
|
|
119
|
+
try {
|
|
120
|
+
await (0, _validateDataUsingSchema.validateDataUsingSchema)({
|
|
121
|
+
data: invalidData,
|
|
122
|
+
schema
|
|
123
|
+
});
|
|
124
|
+
} catch (error) {
|
|
125
|
+
console.log(`exc_info: ${error}`);
|
|
126
|
+
(0, _extendedTest.expect)(error).toBeInstanceOf(_types.ValidationError);
|
|
127
|
+
(0, _extendedTest.expect)(error.message).toContain("Data validation failed");
|
|
128
|
+
(0, _extendedTest.expect)(error.data).toEqual(invalidData);
|
|
129
|
+
}
|
|
130
|
+
});
|
|
131
|
+
(0, _extendedTest.test)("should validate data using schema with attachment custom type", async () => {
|
|
132
|
+
const schema = {
|
|
133
|
+
type: "object",
|
|
134
|
+
properties: {
|
|
135
|
+
file: {
|
|
136
|
+
type: "attachment"
|
|
137
|
+
},
|
|
138
|
+
name: {
|
|
139
|
+
type: "string"
|
|
140
|
+
}
|
|
141
|
+
},
|
|
142
|
+
required: ["file", "name"]
|
|
143
|
+
};
|
|
144
|
+
const validData = {
|
|
145
|
+
file: {
|
|
146
|
+
fileName: "documents/report.pdf",
|
|
147
|
+
bucket: "my-bucket",
|
|
148
|
+
region: "us-east-1",
|
|
149
|
+
endpoint: null,
|
|
150
|
+
suggestedFileName: "Monthly Report.pdf",
|
|
151
|
+
fileType: "document"
|
|
152
|
+
},
|
|
153
|
+
name: "Test File Upload"
|
|
154
|
+
};
|
|
155
|
+
await (0, _extendedTest.expect)((0, _validateDataUsingSchema.validateDataUsingSchema)({
|
|
156
|
+
data: validData,
|
|
157
|
+
schema
|
|
158
|
+
})).resolves.not.toThrow();
|
|
159
|
+
});
|
|
160
|
+
(0, _extendedTest.test)("should validate data using schema with invalid attachment custom type", async () => {
|
|
161
|
+
const schema = {
|
|
162
|
+
type: "object",
|
|
163
|
+
properties: {
|
|
164
|
+
file: {
|
|
165
|
+
type: "attachment"
|
|
166
|
+
},
|
|
167
|
+
name: {
|
|
168
|
+
type: "string"
|
|
169
|
+
}
|
|
170
|
+
},
|
|
171
|
+
required: ["file", "name"]
|
|
172
|
+
};
|
|
173
|
+
const invalidData = {
|
|
174
|
+
file: {
|
|
175
|
+
fileName: "documents/report.pdf"
|
|
176
|
+
},
|
|
177
|
+
name: "Test File Upload"
|
|
178
|
+
};
|
|
179
|
+
await (0, _extendedTest.expect)((0, _validateDataUsingSchema.validateDataUsingSchema)({
|
|
180
|
+
data: invalidData,
|
|
181
|
+
schema
|
|
182
|
+
})).rejects.toThrow(_types.ValidationError);
|
|
183
|
+
try {
|
|
184
|
+
await (0, _validateDataUsingSchema.validateDataUsingSchema)({
|
|
185
|
+
data: invalidData,
|
|
186
|
+
schema
|
|
187
|
+
});
|
|
188
|
+
} catch (error) {
|
|
189
|
+
(0, _extendedTest.expect)(error).toBeInstanceOf(_types.ValidationError);
|
|
190
|
+
(0, _extendedTest.expect)(error.message).toContain("Data validation failed");
|
|
191
|
+
(0, _extendedTest.expect)(error.message).toContain("does not match custom type 'attachment'");
|
|
192
|
+
(0, _extendedTest.expect)(error.data).toEqual(invalidData);
|
|
193
|
+
}
|
|
194
|
+
});
|
|
195
|
+
(0, _extendedTest.test)("should validate data using schema with attachment in array", async () => {
|
|
196
|
+
const schema = {
|
|
197
|
+
type: "array",
|
|
198
|
+
items: {
|
|
199
|
+
type: "object",
|
|
200
|
+
properties: {
|
|
201
|
+
file: {
|
|
202
|
+
type: "attachment"
|
|
203
|
+
},
|
|
204
|
+
description: {
|
|
205
|
+
type: "string"
|
|
206
|
+
}
|
|
207
|
+
},
|
|
208
|
+
required: ["file", "description"]
|
|
209
|
+
}
|
|
210
|
+
};
|
|
211
|
+
const validData = [{
|
|
212
|
+
file: {
|
|
213
|
+
fileName: "doc1.pdf",
|
|
214
|
+
bucket: "bucket1",
|
|
215
|
+
region: "us-east-1",
|
|
216
|
+
suggestedFileName: "Document 1.pdf"
|
|
217
|
+
},
|
|
218
|
+
description: "First document"
|
|
219
|
+
}, {
|
|
220
|
+
file: {
|
|
221
|
+
fileName: "doc2.pdf",
|
|
222
|
+
bucket: "bucket2",
|
|
223
|
+
region: "us-west-2",
|
|
224
|
+
suggestedFileName: "Document 2.pdf"
|
|
225
|
+
},
|
|
226
|
+
description: "Second document"
|
|
227
|
+
}];
|
|
228
|
+
await (0, _extendedTest.expect)((0, _validateDataUsingSchema.validateDataUsingSchema)({
|
|
229
|
+
data: validData,
|
|
230
|
+
schema
|
|
231
|
+
})).resolves.not.toThrow();
|
|
232
|
+
});
|
|
233
|
+
(0, _extendedTest.test)("should validate data using schema with invalid attachment in array", async () => {
|
|
234
|
+
const schema = {
|
|
235
|
+
type: "array",
|
|
236
|
+
items: {
|
|
237
|
+
type: "object",
|
|
238
|
+
properties: {
|
|
239
|
+
file: {
|
|
240
|
+
type: "attachment"
|
|
241
|
+
},
|
|
242
|
+
description: {
|
|
243
|
+
type: "string"
|
|
244
|
+
}
|
|
245
|
+
},
|
|
246
|
+
required: ["file", "description"]
|
|
247
|
+
}
|
|
248
|
+
};
|
|
249
|
+
const invalidData = [{
|
|
250
|
+
file: {
|
|
251
|
+
fileName: "doc1.pdf",
|
|
252
|
+
bucket: "bucket1",
|
|
253
|
+
region: "us-east-1",
|
|
254
|
+
suggestedFileName: "Document 1.pdf"
|
|
255
|
+
},
|
|
256
|
+
description: "First document"
|
|
257
|
+
}, {
|
|
258
|
+
file: {
|
|
259
|
+
fileName: "doc2.pdf"
|
|
260
|
+
},
|
|
261
|
+
description: "Second document"
|
|
262
|
+
}];
|
|
263
|
+
await (0, _extendedTest.expect)((0, _validateDataUsingSchema.validateDataUsingSchema)({
|
|
264
|
+
data: invalidData,
|
|
265
|
+
schema
|
|
266
|
+
})).rejects.toThrow(_types.ValidationError);
|
|
267
|
+
try {
|
|
268
|
+
await (0, _validateDataUsingSchema.validateDataUsingSchema)({
|
|
269
|
+
data: invalidData,
|
|
270
|
+
schema
|
|
271
|
+
});
|
|
272
|
+
} catch (error) {
|
|
273
|
+
(0, _extendedTest.expect)(error).toBeInstanceOf(_types.ValidationError);
|
|
274
|
+
(0, _extendedTest.expect)(error.message).toContain("Data validation failed");
|
|
275
|
+
(0, _extendedTest.expect)(error.message).toContain("does not match custom type 'attachment'");
|
|
276
|
+
(0, _extendedTest.expect)(error.data).toEqual(invalidData);
|
|
277
|
+
}
|
|
278
|
+
});
|
|
279
|
+
(0, _extendedTest.test)("should handle mixed custom and standard types", async () => {
|
|
280
|
+
const schema = {
|
|
281
|
+
type: "object",
|
|
282
|
+
properties: {
|
|
283
|
+
attachment: {
|
|
284
|
+
type: "attachment"
|
|
285
|
+
},
|
|
286
|
+
title: {
|
|
287
|
+
type: "string"
|
|
288
|
+
},
|
|
289
|
+
count: {
|
|
290
|
+
type: "integer"
|
|
291
|
+
},
|
|
292
|
+
active: {
|
|
293
|
+
type: "boolean"
|
|
294
|
+
}
|
|
295
|
+
},
|
|
296
|
+
required: ["attachment", "title", "count"]
|
|
297
|
+
};
|
|
298
|
+
const validData = {
|
|
299
|
+
attachment: {
|
|
300
|
+
fileName: "mixed-test.pdf",
|
|
301
|
+
bucket: "test-bucket",
|
|
302
|
+
region: "us-east-1",
|
|
303
|
+
suggestedFileName: "Mixed Test.pdf"
|
|
304
|
+
},
|
|
305
|
+
title: "Mixed validation test",
|
|
306
|
+
count: 42,
|
|
307
|
+
active: true
|
|
308
|
+
};
|
|
309
|
+
await (0, _extendedTest.expect)((0, _validateDataUsingSchema.validateDataUsingSchema)({
|
|
310
|
+
data: validData,
|
|
311
|
+
schema
|
|
312
|
+
})).resolves.not.toThrow();
|
|
313
|
+
const invalidStandardData = {
|
|
314
|
+
attachment: {
|
|
315
|
+
fileName: "mixed-test.pdf",
|
|
316
|
+
bucket: "test-bucket",
|
|
317
|
+
region: "us-east-1",
|
|
318
|
+
suggestedFileName: "Mixed Test.pdf"
|
|
319
|
+
},
|
|
320
|
+
title: "Mixed validation test",
|
|
321
|
+
count: "not-a-number",
|
|
322
|
+
active: true
|
|
323
|
+
};
|
|
324
|
+
await (0, _extendedTest.expect)((0, _validateDataUsingSchema.validateDataUsingSchema)({
|
|
325
|
+
data: invalidStandardData,
|
|
326
|
+
schema
|
|
327
|
+
})).rejects.toThrow(_types.ValidationError);
|
|
328
|
+
const invalidCustomData = {
|
|
329
|
+
attachment: {
|
|
330
|
+
fileName: "mixed-test.pdf"
|
|
331
|
+
},
|
|
332
|
+
title: "Mixed validation test",
|
|
333
|
+
count: 42,
|
|
334
|
+
active: true
|
|
335
|
+
};
|
|
336
|
+
await (0, _extendedTest.expect)((0, _validateDataUsingSchema.validateDataUsingSchema)({
|
|
337
|
+
data: invalidCustomData,
|
|
338
|
+
schema
|
|
339
|
+
})).rejects.toThrow(_types.ValidationError);
|
|
340
|
+
});
|
|
341
|
+
});
|
|
342
|
+
});
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _extendedTest = require("../../common/extendedTest");
|
|
4
|
+
var _ = require("..");
|
|
5
|
+
var _playwrightCore = require("playwright-core");
|
|
6
|
+
var _waitForDomSettled = require("../waitForDomSettled");
|
|
7
|
+
(0, _extendedTest.describe)("Test waitForDomSettled", () => {
|
|
8
|
+
let browser;
|
|
9
|
+
let page;
|
|
10
|
+
(0, _extendedTest.beforeAll)(async () => {
|
|
11
|
+
browser = await _playwrightCore.chromium.launch({
|
|
12
|
+
headless: true
|
|
13
|
+
});
|
|
14
|
+
});
|
|
15
|
+
(0, _extendedTest.afterAll)(async () => {
|
|
16
|
+
await browser.close();
|
|
17
|
+
});
|
|
18
|
+
(0, _extendedTest.beforeEach)(async () => {
|
|
19
|
+
page = await browser.newPage();
|
|
20
|
+
});
|
|
21
|
+
(0, _extendedTest.afterEach)(async () => {
|
|
22
|
+
await page.close();
|
|
23
|
+
});
|
|
24
|
+
(0, _extendedTest.test)("should wait for DOM to settle after navigation", async () => {
|
|
25
|
+
await page.goto("data:text/html,<html><body><div id='target'></div></body></html>");
|
|
26
|
+
await page.evaluate(() => {
|
|
27
|
+
const intervalId = setInterval(() => {
|
|
28
|
+
const target = document.getElementById("target");
|
|
29
|
+
const div = document.createElement("div");
|
|
30
|
+
div.textContent = String(Date.now());
|
|
31
|
+
target === null || target === void 0 || target.appendChild(div);
|
|
32
|
+
if (target && target.children.length > 10 && target.firstChild) {
|
|
33
|
+
target.removeChild(target.firstChild);
|
|
34
|
+
}
|
|
35
|
+
}, 100);
|
|
36
|
+
setTimeout(() => {
|
|
37
|
+
clearInterval(intervalId);
|
|
38
|
+
}, 5000);
|
|
39
|
+
});
|
|
40
|
+
const settled = await (0, _waitForDomSettled.waitForDomSettled)({
|
|
41
|
+
source: page,
|
|
42
|
+
settleDurationMs: 4000,
|
|
43
|
+
timeoutInMs: 10000
|
|
44
|
+
});
|
|
45
|
+
(0, _extendedTest.expect)(settled).toBe(true);
|
|
46
|
+
});
|
|
47
|
+
(0, _extendedTest.test)("should wait for specific element to settle while ignoring other mutations", async () => {
|
|
48
|
+
await page.goto(`
|
|
49
|
+
data:text/html,
|
|
50
|
+
<html>
|
|
51
|
+
<body>
|
|
52
|
+
<div id='watched-element'></div>
|
|
53
|
+
<div id='ignored-element'></div>
|
|
54
|
+
</body>
|
|
55
|
+
</html>
|
|
56
|
+
`);
|
|
57
|
+
await page.evaluate(() => {
|
|
58
|
+
const watchedElement = document.getElementById("watched-element");
|
|
59
|
+
const ignoredElement = document.getElementById("ignored-element");
|
|
60
|
+
const ignoredInterval = setInterval(() => {
|
|
61
|
+
const div = document.createElement("div");
|
|
62
|
+
div.textContent = `Ignored: ${Date.now()}`;
|
|
63
|
+
ignoredElement === null || ignoredElement === void 0 || ignoredElement.appendChild(div);
|
|
64
|
+
if (ignoredElement && ignoredElement.children.length > 5 && ignoredElement.firstChild) {
|
|
65
|
+
ignoredElement.removeChild(ignoredElement.firstChild);
|
|
66
|
+
}
|
|
67
|
+
}, 50);
|
|
68
|
+
const watchedInterval = setInterval(() => {
|
|
69
|
+
const div = document.createElement("div");
|
|
70
|
+
div.textContent = `Watched: ${Date.now()}`;
|
|
71
|
+
watchedElement === null || watchedElement === void 0 || watchedElement.appendChild(div);
|
|
72
|
+
if (watchedElement && watchedElement.children.length > 3 && watchedElement.firstChild) {
|
|
73
|
+
watchedElement.removeChild(watchedElement.firstChild);
|
|
74
|
+
}
|
|
75
|
+
}, 200);
|
|
76
|
+
setTimeout(() => {
|
|
77
|
+
clearInterval(watchedInterval);
|
|
78
|
+
}, 3000);
|
|
79
|
+
setTimeout(() => {
|
|
80
|
+
clearInterval(ignoredInterval);
|
|
81
|
+
}, 15000);
|
|
82
|
+
});
|
|
83
|
+
const settled = await (0, _waitForDomSettled.waitForDomSettled)({
|
|
84
|
+
source: page.locator("#watched-element"),
|
|
85
|
+
settleDurationMs: 3000,
|
|
86
|
+
timeoutInMs: 10000
|
|
87
|
+
});
|
|
88
|
+
(0, _extendedTest.expect)(settled).toBe(true);
|
|
89
|
+
});
|
|
90
|
+
(0, _extendedTest.test)("should handle no mutations gracefully", async () => {
|
|
91
|
+
await page.goto("data:text/html,<html><body><div id='target'></div></body></html>");
|
|
92
|
+
const settled = await (0, _waitForDomSettled.waitForDomSettled)({
|
|
93
|
+
source: page.locator("#target"),
|
|
94
|
+
settleDurationMs: 3000,
|
|
95
|
+
timeoutInMs: 10000
|
|
96
|
+
});
|
|
97
|
+
(0, _extendedTest.expect)(settled).toBe(true);
|
|
98
|
+
});
|
|
99
|
+
_extendedTest.test.skip("should wait for loading to be complete", async () => {
|
|
100
|
+
await (0, _.goToUrl)({
|
|
101
|
+
page,
|
|
102
|
+
url: "https://www.galvestoncountytx.gov/county-offices/purchasing/solicitations-bids",
|
|
103
|
+
waitForLoadingStateUsingAi: false
|
|
104
|
+
});
|
|
105
|
+
const settled = await (0, _waitForDomSettled.waitForDomSettled)({
|
|
106
|
+
source: page,
|
|
107
|
+
settleDurationMs: 5000,
|
|
108
|
+
timeoutInMs: 10000
|
|
109
|
+
});
|
|
110
|
+
const loading = await page.getByText("Loading...").isVisible();
|
|
111
|
+
(0, _extendedTest.expect)(loading).toBe(false);
|
|
112
|
+
});
|
|
113
|
+
(0, _extendedTest.test)("should work with manual DOM changes", async () => {
|
|
114
|
+
await page.goto("data:text/html,<html><body><div id='target'></div></body></html>");
|
|
115
|
+
await page.evaluate(() => {
|
|
116
|
+
const target = document.getElementById("target");
|
|
117
|
+
const div = document.createElement("div");
|
|
118
|
+
div.textContent = "Added content";
|
|
119
|
+
target === null || target === void 0 || target.appendChild(div);
|
|
120
|
+
});
|
|
121
|
+
const settled = await (0, _waitForDomSettled.waitForDomSettled)({
|
|
122
|
+
source: page,
|
|
123
|
+
settleDurationMs: 5000,
|
|
124
|
+
timeoutInMs: 7000
|
|
125
|
+
});
|
|
126
|
+
(0, _extendedTest.expect)(settled).toBe(true);
|
|
127
|
+
const content = await page.textContent("#target");
|
|
128
|
+
(0, _extendedTest.expect)(content).toContain("Added content");
|
|
129
|
+
});
|
|
130
|
+
(0, _extendedTest.test)("should work with custom settle duration", async () => {
|
|
131
|
+
await page.goto("data:text/html,<html><body><div id='target'></div></body></html>");
|
|
132
|
+
await page.evaluate(() => {
|
|
133
|
+
const target = document.getElementById("target");
|
|
134
|
+
const div = document.createElement("div");
|
|
135
|
+
div.textContent = "Custom duration content";
|
|
136
|
+
target === null || target === void 0 || target.appendChild(div);
|
|
137
|
+
});
|
|
138
|
+
const settled = await (0, _waitForDomSettled.waitForDomSettled)({
|
|
139
|
+
source: page,
|
|
140
|
+
settleDurationMs: 2000,
|
|
141
|
+
timeoutInMs: 30000
|
|
142
|
+
});
|
|
143
|
+
(0, _extendedTest.expect)(settled).toBe(true);
|
|
144
|
+
const content = await page.textContent("#target");
|
|
145
|
+
(0, _extendedTest.expect)(content).toContain("Custom duration content");
|
|
146
|
+
});
|
|
147
|
+
(0, _extendedTest.test)("should work with locator source", async () => {
|
|
148
|
+
await page.goto("data:text/html,<html><body><div id='target'></div></body></html>");
|
|
149
|
+
await page.evaluate(() => {
|
|
150
|
+
const target = document.getElementById("target");
|
|
151
|
+
const div = document.createElement("div");
|
|
152
|
+
div.textContent = "Locator source content";
|
|
153
|
+
target === null || target === void 0 || target.appendChild(div);
|
|
154
|
+
});
|
|
155
|
+
const settled = await (0, _waitForDomSettled.waitForDomSettled)({
|
|
156
|
+
source: page.locator("#target"),
|
|
157
|
+
settleDurationMs: 6000,
|
|
158
|
+
timeoutInMs: 30000
|
|
159
|
+
});
|
|
160
|
+
(0, _extendedTest.expect)(settled).toBe(true);
|
|
161
|
+
const content = await page.textContent("#target");
|
|
162
|
+
(0, _extendedTest.expect)(content).toContain("Locator source content");
|
|
163
|
+
});
|
|
164
|
+
});
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _extendedTest = require("../../common/extendedTest");
|
|
4
|
+
var _playwright = require("playwright");
|
|
5
|
+
var _ = require("..");
|
|
6
|
+
_extendedTest.describe.skip("TestWaitForNetworkIdle", () => {
|
|
7
|
+
let browser;
|
|
8
|
+
let page;
|
|
9
|
+
(0, _extendedTest.beforeEach)(async () => {
|
|
10
|
+
browser = await _playwright.chromium.launch({
|
|
11
|
+
headless: true
|
|
12
|
+
});
|
|
13
|
+
page = await browser.newPage();
|
|
14
|
+
});
|
|
15
|
+
(0, _extendedTest.afterEach)(async () => {
|
|
16
|
+
await browser.close();
|
|
17
|
+
});
|
|
18
|
+
(0, _extendedTest.test)("wait for network idle click element 1", async () => {
|
|
19
|
+
await page.goto("https://www.txsmartbuy.gov/esbd?");
|
|
20
|
+
await page.waitForTimeout(10000);
|
|
21
|
+
await (0, _.withNetworkSettledWait)(async page => {
|
|
22
|
+
await page.locator("xpath=(//*[@id='Next'])[1]").first().click({
|
|
23
|
+
timeout: 10000
|
|
24
|
+
});
|
|
25
|
+
}, {
|
|
26
|
+
page,
|
|
27
|
+
timeoutInMs: 10000
|
|
28
|
+
});
|
|
29
|
+
const currentPage = await page.locator("[aria-label='Current Page']").first().textContent();
|
|
30
|
+
(0, _extendedTest.expect)(currentPage).toBe("2");
|
|
31
|
+
});
|
|
32
|
+
(0, _extendedTest.test)("wait for network idle click element 2", async () => {
|
|
33
|
+
await page.goto("https://www.biddingo.com/soundtransit", {
|
|
34
|
+
timeout: 0
|
|
35
|
+
});
|
|
36
|
+
await page.waitForTimeout(3000);
|
|
37
|
+
await (0, _.withNetworkSettledWait)(async page => {
|
|
38
|
+
await page.locator("[aria-label='Next page']").first().click({
|
|
39
|
+
timeout: 10000
|
|
40
|
+
});
|
|
41
|
+
}, {
|
|
42
|
+
page,
|
|
43
|
+
timeoutInMs: 10000
|
|
44
|
+
});
|
|
45
|
+
const currentPage = await page.locator(".mat-paginator-range-label").first().textContent();
|
|
46
|
+
(0, _extendedTest.expect)(currentPage).toContain("11");
|
|
47
|
+
});
|
|
48
|
+
(0, _extendedTest.test)("wait for network idle press key combination", async () => {
|
|
49
|
+
await page.goto("https://www.txsmartbuy.gov/esbd?&page=3");
|
|
50
|
+
await page.waitForTimeout(10000);
|
|
51
|
+
await page.click("input[name='agencyNumber']");
|
|
52
|
+
await (0, _.withNetworkSettledWait)(async page => {
|
|
53
|
+
await page.keyboard.press("Enter");
|
|
54
|
+
}, {
|
|
55
|
+
page,
|
|
56
|
+
timeoutInMs: 10000
|
|
57
|
+
});
|
|
58
|
+
const currentPage = await page.locator("[aria-label='Current Page']").first().textContent();
|
|
59
|
+
(0, _extendedTest.expect)(currentPage).toBe("1");
|
|
60
|
+
});
|
|
61
|
+
(0, _extendedTest.test)("wait for network idle enter text and click", async () => {
|
|
62
|
+
await page.goto("https://www.txsmartbuy.gov/esbd?&page=3", {
|
|
63
|
+
timeout: 20000
|
|
64
|
+
});
|
|
65
|
+
await page.waitForTimeout(10000);
|
|
66
|
+
await (0, _.withNetworkSettledWait)(async page => {
|
|
67
|
+
await page.fill("input[name='agencyNumber']", "123456");
|
|
68
|
+
await page.click("#content > div > div > form > div.browse-contract-search-actions [type='submit']");
|
|
69
|
+
}, {
|
|
70
|
+
page,
|
|
71
|
+
timeoutInMs: 10000
|
|
72
|
+
});
|
|
73
|
+
await page.getByText("No results found", {
|
|
74
|
+
exact: false
|
|
75
|
+
}).first().textContent();
|
|
76
|
+
});
|
|
77
|
+
(0, _extendedTest.test)("wait for click element 3", async () => {
|
|
78
|
+
await page.goto("https://www.commbuys.com/bso/view/search/external/advancedSearchBid.xhtml");
|
|
79
|
+
await page.waitForTimeout(4000);
|
|
80
|
+
await (0, _.withNetworkSettledWait)(async page => {
|
|
81
|
+
await page.locator("#bidSearchForm\\:btnBidSearch").first().click({
|
|
82
|
+
timeout: 10000
|
|
83
|
+
});
|
|
84
|
+
}, {
|
|
85
|
+
page,
|
|
86
|
+
timeoutInMs: 20000
|
|
87
|
+
});
|
|
88
|
+
(0, _extendedTest.expect)(await page.locator("[aria-label='Page 1']").first().isVisible()).toBe(true);
|
|
89
|
+
});
|
|
90
|
+
(0, _extendedTest.test)("simple callback usage", async () => {
|
|
91
|
+
const result = await (0, _.withNetworkSettledWait)(async page => {
|
|
92
|
+
await page.goto("data:text/html,<html><body><h1>Test</h1></body></html>");
|
|
93
|
+
return "navigation complete";
|
|
94
|
+
}, {
|
|
95
|
+
page
|
|
96
|
+
});
|
|
97
|
+
(0, _extendedTest.expect)(result).toBe("navigation complete");
|
|
98
|
+
const title = await page.textContent("h1");
|
|
99
|
+
(0, _extendedTest.expect)(title).toBe("Test");
|
|
100
|
+
});
|
|
101
|
+
(0, _extendedTest.test)("direct call with callback and options", async () => {
|
|
102
|
+
const result = await (0, _.withNetworkSettledWait)(async page => {
|
|
103
|
+
await page.goto("data:text/html,<html><body><h1>Direct Call</h1></body></html>");
|
|
104
|
+
return "direct call complete";
|
|
105
|
+
}, {
|
|
106
|
+
page: page,
|
|
107
|
+
timeoutInMs: 10000,
|
|
108
|
+
maxInflightRequests: 0
|
|
109
|
+
});
|
|
110
|
+
(0, _extendedTest.expect)(result).toBe("direct call complete");
|
|
111
|
+
const title = await page.textContent("h1");
|
|
112
|
+
(0, _extendedTest.expect)(title).toBe("Direct Call");
|
|
113
|
+
});
|
|
114
|
+
});
|