-
Notifications
You must be signed in to change notification settings - Fork 91
/
alias.js
103 lines (96 loc) · 2.76 KB
/
alias.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
import { getExecutionContext } from '../execution_context';
import { throwBetterError } from '../better-errors';
import {
getProperty,
objectHasProperty
} from '../helpers';
const ALIASED_PROP_NOT_FOUND = 'PageObject does not contain aliased property';
/**
* Returns the value of some other property on the PageObject.
*
* @example
*
* import { create } from 'ember-cli-page-object';
* import { alias } from 'ember-cli-page-object/macros';
*
* const page = create({
* submitButton: {
* scope: '.submit-button'
* }
* submit: alias('submitButton.click')
* });
*
* // calls `page.submitButton.click`
* page.submit();
*
* @example
*
* import { create } from 'ember-cli-page-object';
* import { alias } from 'ember-cli-page-object/macros';
*
* const page = create({
* submitButton: {
* scope: '.submit-button'
* }
* isSubmitButtonVisible: alias('submitButton.isVisible')
* });
*
* // checks value of `page.submitButton.isVisible`
* assert.ok(page.isSubmitButtonVisible);
*
* @example
*
* import { create } from 'ember-cli-page-object';
* import { alias } from 'ember-cli-page-object/macros';
*
* const page = create({
* form: {
* input {
* scope: 'input'
* },
* submitButton: {
* scope: '.submit-button'
* }
* },
* fillFormInput: alias('form.input.fillIn', { chainable: true }),
* submitForm: alias('form.submitButton.click', { chainable: true })
* });
*
* // executes `page.form.input.fillIn` then `page.form.submitButton.click`
* // and causes both methods to return `page` (instead of `page.form.input`
* // and `page.form.submitButton` respectively) so that the aliased methods
* // can be chained off `page`.
*
* page
* .fillFormInput('foo')
* .submitForm();
*
* @public
*
* @param {string} pathToProp - dot-separated path to a property specified on the PageObject
* @param {Object} options
* @param {Boolean} options.chainable - when this is true, an aliased
* method returns the PageObject node on which the alias is defined, rather
* than the PageObject node on which the aliased property is defined.
* @return {Descriptor}
*
* @throws Will throw an error if the PageObject does not have the specified property.
*/
export function alias(pathToProp, options = {}) {
return {
isDescriptor: true,
get(key) {
if (!objectHasProperty(this, pathToProp)) {
throwBetterError(this, key, `${ALIASED_PROP_NOT_FOUND} \`${pathToProp}\`.`);
}
const value = getProperty(this, pathToProp);
if (typeof value !== 'function' || !options.chainable) {
return value;
}
const executionContext = getExecutionContext(this);
return function(...args) {
return executionContext.runAsync(() => value(...args));
};
}
};
}