@jahia/cypress 1.0.5 → 1.0.9

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/README.md CHANGED
@@ -14,6 +14,8 @@
14
14
 
15
15
  [`.logout()`](./src/support/logout.md)
16
16
 
17
+ [`.repeatUntil()`](./src/support/repeatUntil.md)
18
+
17
19
  ## Page / component objects
18
20
 
19
21
  In Page Object Model, a set of object is provided to handle known and reused web elements.
@@ -1,10 +1,20 @@
1
1
  "use strict";
2
2
  exports.__esModule = true;
3
3
  var env = function (on, config) {
4
- console.log('Setting env', process.env.JAHIA_URL);
5
- config.baseUrl = process.env.JAHIA_URL;
6
- config.env.JAHIA_URL = process.env.JAHIA_URL;
7
- config.env.SUPER_USER_PASSWORD = process.env.SUPER_USER_PASSWORD;
4
+ if (!process.env.JAHIA_URL && !process.env.SUPER_USER_PASSWORD) {
5
+ console.warn('No environment set, will use default values');
6
+ config.baseUrl = 'http://localhost:8080';
7
+ config.env.JAHIA_URL = 'http://localhost:8080';
8
+ config.env.SUPER_USER_PASSWORD = 'root1234';
9
+ }
10
+ else {
11
+ console.log('Setting environment');
12
+ config.baseUrl = process.env.JAHIA_URL;
13
+ config.env.JAHIA_URL = process.env.JAHIA_URL;
14
+ config.env.SUPER_USER_PASSWORD = process.env.SUPER_USER_PASSWORD;
15
+ }
16
+ console.log('JAHIA_URL =', config.env.JAHIA_URL);
17
+ console.log('SUPER_USER_PASSWORD =', config.env.SUPER_USER_PASSWORD);
8
18
  return config;
9
19
  };
10
20
  exports["default"] = env;
@@ -2,3 +2,4 @@ export * from './apollo';
2
2
  export * from './provisioning';
3
3
  export * from './login';
4
4
  export * from './logout';
5
+ export * from './repeatUntil';
@@ -14,3 +14,4 @@ __exportStar(require("./apollo"), exports);
14
14
  __exportStar(require("./provisioning"), exports);
15
15
  __exportStar(require("./login"), exports);
16
16
  __exportStar(require("./logout"), exports);
17
+ __exportStar(require("./repeatUntil"), exports);
@@ -3,31 +3,39 @@
3
3
  exports.__esModule = true;
4
4
  exports.runProvisioningScript = void 0;
5
5
  /// <reference types="cypress" />
6
- function getBlob(formFile) {
7
- return new Promise(function (resolve) {
8
- if (formFile.fileContent) {
9
- resolve(new Blob([formFile.fileContent], { type: formFile.type }));
10
- }
11
- else {
12
- cy.fixture(formFile.fileName, (formFile.encoding ? formFile.encoding : 'binary')).then(function (content) {
13
- if (formFile.replacements) {
14
- Object.keys(formFile.replacements).forEach(function (k) { return content = content.replaceAll(k, formFile.replacements[k]); });
15
- }
6
+ function processContent(formFile) {
7
+ var content = formFile.fileContent;
8
+ if (formFile.replacements) {
9
+ Object.keys(formFile.replacements).forEach(function (k) { return content = content.replaceAll(k, formFile.replacements[k]); });
10
+ }
11
+ formFile.fileContent = content;
12
+ return Cypress.Blob.binaryStringToBlob(content, formFile.type);
13
+ }
14
+ function append(formFile, formData, key) {
15
+ if (formFile.fileContent) {
16
+ formData.append(key, processContent(formFile), formFile.fileName);
17
+ }
18
+ else {
19
+ cy.fixture(formFile.fileName, (formFile.encoding ? formFile.encoding : 'binary')).then(function (content) {
20
+ if (typeof content === 'object') {
21
+ formFile.fileContent = JSON.stringify(content);
22
+ }
23
+ else {
16
24
  formFile.fileContent = content;
17
- resolve(Cypress.Blob.binaryStringToBlob(content, formFile.type));
18
- });
19
- }
20
- });
25
+ }
26
+ formData.append(key, processContent(formFile), formFile.fileName);
27
+ });
28
+ }
21
29
  }
22
30
  var runProvisioningScript = function (script, files, options) {
23
31
  if (options === void 0) { options = { log: true }; }
24
32
  var formData = new FormData();
25
- getBlob(script).then(function (blob) { return formData.append("script", blob); });
26
- files.forEach(function (f) {
27
- getBlob(f).then(function (blob) {
28
- formData.append("file", blob, f.fileName);
33
+ append(script, formData, "script");
34
+ if (files) {
35
+ files.forEach(function (f) {
36
+ append(f, formData, "file");
29
37
  });
30
- });
38
+ }
31
39
  var response;
32
40
  var result;
33
41
  var logger;
@@ -10,6 +10,7 @@ var login_1 = require("./login");
10
10
  var logout_1 = require("./logout");
11
11
  var installLogsCollector_1 = __importDefault(require("cypress-terminal-report/src/installLogsCollector"));
12
12
  var fixture_1 = require("./fixture");
13
+ var repeatUntil_1 = require("./repeatUntil");
13
14
  var registerSupport = function () {
14
15
  Cypress.Commands.add('apolloClient', apollo_1.apolloClient);
15
16
  Cypress.Commands.add('apollo', { prevSubject: 'optional' }, apollo_1.apollo);
@@ -17,6 +18,7 @@ var registerSupport = function () {
17
18
  Cypress.Commands.add('executeGroovy', provisioning_1.executeGroovy);
18
19
  Cypress.Commands.add('login', login_1.login);
19
20
  Cypress.Commands.add('logout', logout_1.logout);
21
+ Cypress.Commands.add('repeatUntil', repeatUntil_1.repeatUntil);
20
22
  Cypress.Commands.overwrite('fixture', fixture_1.fixture);
21
23
  installLogsCollector_1["default"]();
22
24
  };
@@ -0,0 +1,15 @@
1
+ /// <reference types="cypress" />
2
+ declare type ReloadUntilOptions = {
3
+ attempts: number;
4
+ reloadCallback: () => void;
5
+ delay: number;
6
+ };
7
+ declare global {
8
+ namespace Cypress {
9
+ interface Chainable<Subject> {
10
+ reloadUntil(selector: string, options: Partial<ReloadUntilOptions>): Chainable<Cypress.Response<any>>;
11
+ }
12
+ }
13
+ }
14
+ export declare const reloadUntil: (selector: string, options: Partial<ReloadUntilOptions>) => void;
15
+ export {};
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ /* eslint-disable @typescript-eslint/no-explicit-any, @typescript-eslint/no-namespace */
3
+ var __assign = (this && this.__assign) || function () {
4
+ __assign = Object.assign || function(t) {
5
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
6
+ s = arguments[i];
7
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
8
+ t[p] = s[p];
9
+ }
10
+ return t;
11
+ };
12
+ return __assign.apply(this, arguments);
13
+ };
14
+ exports.__esModule = true;
15
+ exports.reloadUntil = void 0;
16
+ var defaultOptions = {
17
+ attempts: 10,
18
+ reloadCallback: function () { return cy.reload({ log: false }); },
19
+ delay: 1000
20
+ };
21
+ var reloadUntil = function (selector, options) {
22
+ options = __assign(__assign({}, defaultOptions), options);
23
+ var log = Cypress.log({
24
+ name: 'reloadUntil',
25
+ message: "Reload until " + selector + ", remaining attempts : " + options.attempts,
26
+ consoleProps: function () {
27
+ return {
28
+ attempts: options.attempts
29
+ };
30
+ }
31
+ });
32
+ var items = Cypress.$(selector);
33
+ if (items.length) {
34
+ log.set({ $el: items });
35
+ return;
36
+ }
37
+ if (options.attempts > 1) {
38
+ log.end();
39
+ options.reloadCallback();
40
+ // eslint-disable-next-line cypress/no-unnecessary-waiting
41
+ cy.wait(options.delay);
42
+ cy.reloadUntil(selector, __assign(__assign({}, options), { attempts: options.attempts - 1 }));
43
+ }
44
+ else {
45
+ var err = Error('Items not found.');
46
+ log.error(err);
47
+ throw err;
48
+ }
49
+ };
50
+ exports.reloadUntil = reloadUntil;
@@ -0,0 +1,15 @@
1
+ /// <reference types="cypress" />
2
+ declare type RepeatUntilOptions = {
3
+ attempts: number;
4
+ callback: () => void;
5
+ delay: number;
6
+ };
7
+ declare global {
8
+ namespace Cypress {
9
+ interface Chainable<Subject> {
10
+ repeatUntil(selector: string, options?: Partial<RepeatUntilOptions>): Chainable<JQuery>;
11
+ }
12
+ }
13
+ }
14
+ export declare const repeatUntil: (selector: string, options?: Partial<RepeatUntilOptions>) => void;
15
+ export {};
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ /* eslint-disable @typescript-eslint/no-explicit-any, @typescript-eslint/no-namespace */
3
+ var __assign = (this && this.__assign) || function () {
4
+ __assign = Object.assign || function(t) {
5
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
6
+ s = arguments[i];
7
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
8
+ t[p] = s[p];
9
+ }
10
+ return t;
11
+ };
12
+ return __assign.apply(this, arguments);
13
+ };
14
+ exports.__esModule = true;
15
+ exports.repeatUntil = void 0;
16
+ var defaultOptions = {
17
+ attempts: 10,
18
+ callback: function () { return cy.reload({ log: false }); },
19
+ delay: 1000
20
+ };
21
+ var repeatUntil = function (selector, options) {
22
+ if (options === void 0) { options = {}; }
23
+ options = __assign(__assign({}, defaultOptions), options);
24
+ var log = Cypress.log({
25
+ name: 'repeatUntil',
26
+ message: "Reload until " + selector + ", remaining attempts : " + options.attempts,
27
+ consoleProps: function () {
28
+ return {
29
+ attempts: options.attempts
30
+ };
31
+ }
32
+ });
33
+ var items = Cypress.$(selector);
34
+ if (items.length) {
35
+ log.set({ $el: items });
36
+ cy.wrap(items, { log: false });
37
+ return;
38
+ }
39
+ if (options.attempts > 1) {
40
+ log.end();
41
+ options.callback();
42
+ // eslint-disable-next-line cypress/no-unnecessary-waiting
43
+ cy.wait(options.delay);
44
+ cy.repeatUntil(selector, __assign(__assign({}, options), { attempts: options.attempts - 1 }));
45
+ }
46
+ else {
47
+ var err = Error('Items not found.');
48
+ log.error(err);
49
+ throw err;
50
+ }
51
+ };
52
+ exports.repeatUntil = repeatUntil;
@@ -0,0 +1,15 @@
1
+ /// <reference types="cypress" />
2
+ declare type ReloadUntilOptions = {
3
+ attempts: number;
4
+ reloadCallback: () => void;
5
+ delay: number;
6
+ };
7
+ declare global {
8
+ namespace Cypress {
9
+ interface Chainable<Subject> {
10
+ reloadUntil(selector: string, options: Partial<ReloadUntilOptions>): Chainable<Cypress.Response<any>>;
11
+ }
12
+ }
13
+ }
14
+ export declare const reloadUntil: (selector: string, options: Partial<ReloadUntilOptions>) => void;
15
+ export {};
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ /* eslint-disable @typescript-eslint/no-explicit-any, @typescript-eslint/no-namespace */
3
+ var __assign = (this && this.__assign) || function () {
4
+ __assign = Object.assign || function(t) {
5
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
6
+ s = arguments[i];
7
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
8
+ t[p] = s[p];
9
+ }
10
+ return t;
11
+ };
12
+ return __assign.apply(this, arguments);
13
+ };
14
+ exports.__esModule = true;
15
+ exports.reloadUntil = void 0;
16
+ var defaultOptions = {
17
+ attempts: 10,
18
+ reloadCallback: function () { return cy.reload({ log: false }); },
19
+ delay: 1000
20
+ };
21
+ var reloadUntil = function (selector, options) {
22
+ options = __assign(__assign({}, defaultOptions), options);
23
+ var log = Cypress.log({
24
+ name: 'reloadUntil',
25
+ message: "Reload until " + selector + ", remaining attempts : " + options.attempts
26
+ });
27
+ var $items = Cypress.$(selector);
28
+ if ($items.length) {
29
+ return;
30
+ }
31
+ if (options.attempts > 1) {
32
+ log.finish();
33
+ options.reloadCallback();
34
+ // eslint-disable-next-line cypress/no-unnecessary-waiting
35
+ cy.wait(1000, { log: false });
36
+ cy.reloadUntil(selector, __assign(__assign({}, options), { attempts: options.attempts - 1 }));
37
+ }
38
+ else {
39
+ var err = Error('Items not found.');
40
+ log.error(err);
41
+ throw err;
42
+ }
43
+ };
44
+ exports.reloadUntil = reloadUntil;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jahia/cypress",
3
- "version": "1.0.5",
3
+ "version": "1.0.9",
4
4
  "scripts": {
5
5
  "build": "tsc",
6
6
  "lint": "eslint src -c .eslintrc.json --ext .ts"
@@ -0,0 +1,3 @@
1
+ interface String {
2
+ replaceAll(input: string, output : string): any;
3
+ }
@@ -1,8 +1,17 @@
1
1
  const env = (on:Cypress.PluginEvents, config: Cypress.PluginConfigOptions):Cypress.PluginConfigOptions => {
2
- console.log('Setting env', process.env.JAHIA_URL)
3
- config.baseUrl = process.env.JAHIA_URL
4
- config.env.JAHIA_URL = process.env.JAHIA_URL
5
- config.env.SUPER_USER_PASSWORD = process.env.SUPER_USER_PASSWORD
2
+ if (!process.env.JAHIA_URL && !process.env.SUPER_USER_PASSWORD) {
3
+ console.warn('No environment set, will use default values')
4
+ config.baseUrl = 'http://localhost:8080'
5
+ config.env.JAHIA_URL = 'http://localhost:8080'
6
+ config.env.SUPER_USER_PASSWORD = 'root1234'
7
+ } else {
8
+ console.log('Setting environment');
9
+ config.baseUrl = process.env.JAHIA_URL
10
+ config.env.JAHIA_URL = process.env.JAHIA_URL
11
+ config.env.SUPER_USER_PASSWORD = process.env.SUPER_USER_PASSWORD
12
+ }
13
+ console.log('JAHIA_URL =', config.env.JAHIA_URL)
14
+ console.log('SUPER_USER_PASSWORD =', config.env.SUPER_USER_PASSWORD)
6
15
 
7
16
  return config
8
17
  }
@@ -2,3 +2,4 @@ export * from './apollo'
2
2
  export * from './provisioning'
3
3
  export * from './login'
4
4
  export * from './logout'
5
+ export * from './repeatUntil'
@@ -22,31 +22,39 @@ type FormFile = {
22
22
  replacements?: { [key: string]: string }
23
23
  }
24
24
 
25
- function getBlob(formFile: FormFile): Promise<Blob> {
26
- return new Promise(resolve => {
27
- if (formFile.fileContent) {
28
- resolve(new Blob([formFile.fileContent], {type: formFile.type}))
29
- } else {
30
- cy.fixture(formFile.fileName, (formFile.encoding ? formFile.encoding : 'binary')).then(content => {
31
- if (formFile.replacements) {
32
- Object.keys(formFile.replacements).forEach(k => content = content.replaceAll(k, formFile.replacements[k]))
33
- }
34
- formFile.fileContent = content
35
- resolve(Cypress.Blob.binaryStringToBlob(content, formFile.type))
36
- })
37
- }
38
- })
25
+ function processContent(formFile: FormFile) {
26
+ let content = formFile.fileContent;
27
+ if (formFile.replacements) {
28
+ Object.keys(formFile.replacements).forEach(k => content = content.replaceAll(k, formFile.replacements[k]))
29
+ }
30
+ formFile.fileContent = content
31
+ return Cypress.Blob.binaryStringToBlob(content, formFile.type);
32
+ }
33
+
34
+ function append(formFile: FormFile, formData: FormData, key: string) {
35
+ if (formFile.fileContent) {
36
+ formData.append(key, processContent(formFile), formFile.fileName);
37
+ } else {
38
+ cy.fixture(formFile.fileName, (formFile.encoding ? formFile.encoding : 'binary')).then(content => {
39
+ if (typeof content === 'object') {
40
+ formFile.fileContent = JSON.stringify(content);
41
+ } else {
42
+ formFile.fileContent = content;
43
+ }
44
+ formData.append(key, processContent(formFile), formFile.fileName);
45
+ })
46
+ }
39
47
  }
40
48
 
41
49
  export const runProvisioningScript = (script: FormFile, files?: FormFile[], options: Cypress.Loggable = {log:true}): void => {
42
50
  const formData = new FormData()
43
51
 
44
- getBlob(script).then(blob => formData.append("script", blob))
45
- files.forEach((f) => {
46
- getBlob(f).then(blob => {
47
- formData.append("file", blob, f.fileName)
52
+ append(script, formData, "script")
53
+ if (files) {
54
+ files.forEach((f) => {
55
+ append(f, formData, "file")
48
56
  })
49
- })
57
+ }
50
58
 
51
59
  let response: Cypress.Response<any>
52
60
  let result: any
@@ -4,6 +4,7 @@ import {login} from "./login"
4
4
  import {logout} from "./logout"
5
5
  import installLogsCollector from 'cypress-terminal-report/src/installLogsCollector'
6
6
  import {fixture} from "./fixture";
7
+ import {repeatUntil} from "./repeatUntil";
7
8
 
8
9
  export const registerSupport = (): void => {
9
10
  Cypress.Commands.add('apolloClient', apolloClient)
@@ -14,6 +15,7 @@ export const registerSupport = (): void => {
14
15
 
15
16
  Cypress.Commands.add('login', login)
16
17
  Cypress.Commands.add('logout', logout)
18
+ Cypress.Commands.add('repeatUntil', repeatUntil)
17
19
 
18
20
  Cypress.Commands.overwrite('fixture', fixture)
19
21
 
@@ -0,0 +1,40 @@
1
+ # repeatUntil
2
+
3
+ This commands reload or repeat a function until an item is visible in the page
4
+
5
+ ## Syntax
6
+
7
+ ### Usage
8
+
9
+ ```
10
+ cy.repeatUntil('div:contains("some text")')
11
+ cy.repeatUntil('div:contains("some text")', {attempts: 10, reloadCallback: () => { cy.reload() }, delay: 1000})
12
+ ```
13
+
14
+ ### Arguments
15
+
16
+ #### &gt; selector (`string`)
17
+
18
+ The selector that is being searched in the page
19
+
20
+ #### &gt; options (`RepeatUntilOptions`)
21
+
22
+ - `attempts`: max number of attempts
23
+ - `callback`: the callback to execute if the item is not found. By default, do a `cy.reload()`
24
+ - `delay`: time to wait between each attemps (ms)
25
+
26
+ ### Yields
27
+
28
+ The found element
29
+
30
+ ## Rules
31
+
32
+ ### Requirements
33
+
34
+ - `cy.repeatUntil()` requires being chained off of `cy`.
35
+
36
+ ### Assertions
37
+
38
+ ### Timeouts
39
+
40
+ ## Command Log
@@ -0,0 +1,59 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any, @typescript-eslint/no-namespace */
2
+
3
+ // Load type definitions that come with Cypress module
4
+ /// <reference types="cypress" />
5
+
6
+ type RepeatUntilOptions = {
7
+ attempts: number,
8
+ callback: () => void,
9
+ delay: number,
10
+ }
11
+
12
+ const defaultOptions: RepeatUntilOptions = {
13
+ attempts: 10,
14
+ callback: () => cy.reload({log:false}),
15
+ delay: 1000
16
+ }
17
+
18
+ declare global {
19
+ namespace Cypress {
20
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
21
+ interface Chainable<Subject> {
22
+ repeatUntil(selector: string, options?: Partial<RepeatUntilOptions>): Chainable<JQuery>
23
+ }
24
+ }
25
+ }
26
+
27
+ export const repeatUntil = (selector: string, options: Partial<RepeatUntilOptions> = {}): void => {
28
+ options = { ...defaultOptions, ...options }
29
+
30
+ const log = Cypress.log({
31
+ name: 'repeatUntil',
32
+ message: `Reload until ${selector}, remaining attempts : ${options.attempts}`,
33
+ consoleProps: () => {
34
+ return {
35
+ attempts: options.attempts,
36
+ }
37
+ },
38
+ })
39
+
40
+ const items = Cypress.$(selector)
41
+ if (items.length) {
42
+ log.set({ $el: items })
43
+ cy.wrap(items, {log: false})
44
+ return
45
+ }
46
+
47
+ if (options.attempts > 1) {
48
+ log.end()
49
+ options.callback()
50
+
51
+ // eslint-disable-next-line cypress/no-unnecessary-waiting
52
+ cy.wait(options.delay)
53
+ cy.repeatUntil(selector, {...options, attempts: options.attempts - 1})
54
+ } else {
55
+ const err = Error('Items not found.')
56
+ log.error(err)
57
+ throw err
58
+ }
59
+ }