Skip to content

Commit e359f1c

Browse files
committed
Switch to more comprehensive tests of setting attributes sharing names with unwriteable properties
1 parent 262fd1c commit e359f1c

20 files changed

+188
-46
lines changed

libraries/__shared__/webcomponents/src/ce-with-methods.js renamed to libraries/__shared__/webcomponents/src/ce-without-properties.js

+14-4
Original file line numberDiff line numberDiff line change
@@ -15,16 +15,26 @@
1515
* limitations under the License.
1616
*/
1717

18-
class CEWithMethods extends HTMLElement {
18+
class CEWithoutProperties extends HTMLElement {
1919

20-
test() {
20+
amethod() {
2121
this.innerText = 'Success';
22+
return 'method';
23+
}
24+
25+
get agetter() {
26+
return 'getter';
2227
}
2328

2429
connectedCallback() {
25-
this.test();
30+
this.amethod();
2631
}
2732

2833
}
2934

30-
customElements.define('ce-with-methods', CEWithMethods);
35+
Object.defineProperty(CEWithoutProperties.prototype, 'areadonly', {
36+
value: 'readonly',
37+
writable: false
38+
});
39+
40+
customElements.define('ce-without-properties', CEWithoutProperties);

libraries/angular/src/basic-tests.js

+9-5
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ import {
2828
ComponentWithUnregistered,
2929
ComponentWithImperativeEvent,
3030
ComponentWithDeclarativeEvent,
31-
ComponentWithMethods
31+
ComponentWithoutProperties
3232
} from "./components";
3333

3434
beforeEach(function() {
@@ -42,7 +42,7 @@ beforeEach(function() {
4242
ComponentWithUnregistered,
4343
ComponentWithImperativeEvent,
4444
ComponentWithDeclarativeEvent,
45-
ComponentWithMethods
45+
ComponentWithoutProperties
4646
],
4747
schemas: [CUSTOM_ELEMENTS_SCHEMA]
4848
});
@@ -149,11 +149,15 @@ describe("basic support", function() {
149149
expect(data).to.eql("Angular");
150150
});
151151

152-
it('will not overwrite methods', function () {
153-
let fixture = TestBed.createComponent(ComponentWithMethods);
152+
it('will not overwrite unwriteable properties', function () {
153+
let fixture = TestBed.createComponent(ComponentWithoutProperties);
154154
fixture.detectChanges();
155155
let root = fixture.debugElement.nativeElement;
156-
expect(root.innerText).to.eql('Success')
156+
let wc = root.querySelector("#wc");
157+
expect(wc.getAttribute('amethod')).to.eql('method');
158+
expect(wc.getAttribute('agetter')).to.eql('getter');
159+
expect(wc.getAttribute('areadonly')).to.eql('readonly');
160+
expect(wc.innerHTML).to.eql('Success');
157161
});
158162
});
159163

libraries/angular/src/components.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ import 'ce-without-children';
2727
import 'ce-with-children';
2828
import 'ce-with-properties';
2929
import 'ce-with-event';
30-
import 'ce-with-methods';
30+
import 'ce-without-properties';
3131

3232
@Component({
3333
template: `
@@ -109,11 +109,11 @@ export class ComponentWithProperties {
109109
@Component({
110110
template: `
111111
<div>
112-
<ce-with-methods [test]="true"></ce-with-methods>
112+
<ce-without-properties amethod="method" agetter="getter" areadonly="readonly" id="wc"></ce-without-properties>
113113
</div>
114114
`
115115
})
116-
export class ComponentWithMethods {}
116+
export class ComponentWithoutProperties {}
117117

118118
@Component({
119119
template: `

libraries/angularjs/src/app.module.js

+2
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import {
66
ComponentWithChildrenRerender,
77
ComponentWithDifferentViews,
88
ComponentWithProps,
9+
ComponentWithoutProps,
910
ComponentWithImperativeEvent,
1011
ComponentWithDeclarativeEvent
1112
} from './components';
@@ -16,6 +17,7 @@ export default angular.module('ce-tests', [])
1617
.component('compWithChildrenRerender', ComponentWithChildrenRerender)
1718
.component('compWithDifferentViews', ComponentWithDifferentViews)
1819
.component('compWithProps', ComponentWithProps)
20+
.component('compWithoutProps', ComponentWithoutProps)
1921
.component('compWithImperativeEvent', ComponentWithImperativeEvent)
2022
.component('compWithDeclarativeEvent', ComponentWithDeclarativeEvent)
2123
.name;

libraries/angularjs/src/basic-tests.js

+13
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,19 @@ describe("basic support", () => {
113113
});
114114
});
115115

116+
describe("without properties", () => {
117+
it('will not overwrite unwriteable properties', function () {
118+
this.weight = 3;
119+
const comp = compile("<comp-without-props>")(scope);
120+
scope.$digest();
121+
const wc = comp[0].querySelector("#wc");
122+
expect(wc.getAttribute('amethod')).to.eql('method');
123+
expect(wc.getAttribute('agetter')).to.eql('getter');
124+
expect(wc.getAttribute('areadonly')).to.eql('readonly');
125+
expect(wc.innerHTML).to.eql('Success');
126+
});
127+
});
128+
116129
describe("events", () => {
117130
it("can imperatively listen to a DOM event dispatched by a Custom Element", function() {
118131
this.weight = 3;

libraries/angularjs/src/components.js

+23
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,28 @@ const ComponentWithProps = {
8181
}
8282
};
8383

84+
const ComponentWithoutProps = {
85+
template: `
86+
<div>
87+
<ce-without-properties id="wc"
88+
ng-attr-amethod="{{ $ctrl.method }}"
89+
ng-attr-agetter="{{ $ctrl.getter }}"
90+
ng-attr-areadonly="{{ $ctrl.readonly }}"
91+
></ce-without-properties>
92+
</div>
93+
`,
94+
controller: class {
95+
constructor() {}
96+
$onInit() {
97+
angular.extend(this, {
98+
method: 'method',
99+
getter: 'getter',
100+
readonly: 'readonly'
101+
})
102+
}
103+
}
104+
}
105+
84106
const ComponentWithImperativeEvent = {
85107
template: `
86108
<div>
@@ -154,6 +176,7 @@ export {
154176
ComponentWithChildrenRerender,
155177
ComponentWithDifferentViews,
156178
ComponentWithProps,
179+
ComponentWithoutProps,
157180
ComponentWithImperativeEvent,
158181
ComponentWithDeclarativeEvent
159182
}

libraries/dio/src/basic-tests.js

+12-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@ import {
2525
ComponentWithProperties,
2626
ComponentWithUnregistered,
2727
ComponentWithImperativeEvent,
28-
ComponentWithDeclarativeEvent
28+
ComponentWithDeclarativeEvent,
29+
ComponentWithoutProperties
2930
} from "./components";
3031

3132
// Setup the test harness. This will get cleaned out with every test.
@@ -128,6 +129,16 @@ describe("basic support", function() {
128129
let data = wc.str || wc.getAttribute("str");
129130
expect(data).to.eql("DIO");
130131
});
132+
133+
it('will not overwrite unwriteable properties', function () {
134+
render(<ComponentWithoutProperties />, scratch);
135+
console.log(scratch);
136+
let wc = scratch.querySelector("#wc");
137+
expect(wc.getAttribute('amethod')).to.eql('method');
138+
expect(wc.getAttribute('agetter')).to.eql('getter');
139+
expect(wc.getAttribute('areadonly')).to.eql('readonly');
140+
expect(wc.innerHTML).to.eql('Success');
141+
})
131142
});
132143

133144
describe("events", function() {

libraries/dio/src/components.js

+11
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import 'ce-without-children';
2020
import 'ce-with-children';
2121
import 'ce-with-properties';
2222
import 'ce-with-event';
23+
import 'ce-without-properties';
2324

2425
export class ComponentWithoutChildren extends Component {
2526
render() {
@@ -109,6 +110,16 @@ export class ComponentWithProperties extends Component {
109110
}
110111
}
111112

113+
export class ComponentWithoutProperties extends Component {
114+
render () {
115+
return (
116+
<div>
117+
<ce-without-properties id="wc" amethod="method" agetter="getter" areadonly="readonly" />
118+
</div>
119+
)
120+
}
121+
}
122+
112123
export class ComponentWithUnregistered extends Component {
113124
render () {
114125
const data = {

libraries/dojo/src/basic-tests.ts

+12-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@ import {
2222
ComponentWithChildrenRerender,
2323
ComponentWithDifferentViews,
2424
ComponentWithProperties,
25-
ComponentWithImperativeEvent
25+
ComponentWithImperativeEvent,
26+
ComponentWithoutProperties
2627
} from "./components";
2728

2829
import renderer, { w } from "@dojo/framework/core/vdom";
@@ -128,6 +129,16 @@ describe("basic support", function() {
128129
const data = wc.getAttribute("str");
129130
expect(data).to.eql("Dojo");
130131
});
132+
133+
it('will not overwrite unwriteable properties', function () {
134+
const r = renderer(() => w(ComponentWithoutProperties, {}));
135+
r.mount({ domNode: scratch, sync: true });
136+
const wc: any = document.querySelector("ce-without-properties");
137+
expect(wc.getAttribute('amethod')).to.eql('method');
138+
expect(wc.getAttribute('agetter')).to.eql('getter');
139+
expect(wc.getAttribute('areadonly')).to.eql('readonly');
140+
expect(wc.innerHTML).to.eql('Success');
141+
});
131142
});
132143

133144
describe("events", function() {

libraries/dojo/src/components.ts

+10
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import 'ce-without-children';
2121
import 'ce-with-children';
2222
import 'ce-with-properties';
2323
import 'ce-with-event';
24+
import 'ce-without-properties';
2425

2526
const factory = create({ icache });
2627

@@ -67,6 +68,15 @@ export const ComponentWithProperties = factory(() => {
6768
return v('ce-with-properties', data);
6869
});
6970

71+
export const ComponentWithoutProperties = factory(() => {
72+
const data = {
73+
amethod: 'method',
74+
agetter: 'getter',
75+
areadonly: 'readonly'
76+
};
77+
return v('ce-without-properties', data);
78+
})
79+
7080
export const ComponentWithUnregistered = factory(() => {
7181
const data = {
7282
bool: true,

libraries/hybrids/src/basic-tests.js

+20
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import {
2525
ComponentWithDifferentViews,
2626
ComponentWithProperties,
2727
ComponentWithDeclarativeEvent,
28+
ComponentWithoutProperties,
2829
} from "./components";
2930

3031
describe("basic support", function() {
@@ -165,6 +166,25 @@ describe("basic support", function() {
165166
});
166167
});
167168

169+
describe('without properties', function () {
170+
define("component-without-properties", ComponentWithoutProperties);
171+
172+
beforeEach(() => {
173+
root.appendChild(document.createElement("component-without-properties"));
174+
});
175+
176+
it('will not overwrite unwriteable properties', function () {
177+
this.weight = 3;
178+
requestAnimationFrame(() => {
179+
const wc = root.firstElementChild.shadowRoot.querySelector('#wc');
180+
expect(wc.getAttribute('amethod')).to.eql('method');
181+
expect(wc.getAttribute('agetter')).to.eql('getter');
182+
expect(wc.getAttribute('areadonly')).to.eql('readonly');
183+
expect(wc.innerHTML).to.eql('Success');
184+
})
185+
});
186+
});
187+
168188
describe("events", function() {
169189
define("component-with-declarative-event", ComponentWithDeclarativeEvent);
170190

libraries/hybrids/src/components.js

+12
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import 'ce-without-children';
1919
import 'ce-with-children';
2020
import 'ce-with-properties';
2121
import 'ce-with-event';
22+
import 'ce-without-properties';
2223

2324
import { html } from 'hybrids';
2425

@@ -62,6 +63,17 @@ export const ComponentWithProperties = {
6263
`,
6364
};
6465

66+
export const ComponentWithoutProperties = {
67+
render: () => html`
68+
<ce-without-properties
69+
id="wc"
70+
amethod="method"
71+
agetter="getter"
72+
areadonly="readonly"
73+
></ce-without-properties>
74+
`
75+
}
76+
6577
export const ComponentWithDeclarativeEvent = {
6678
lowercaseHandled: false,
6779
kebabHandled: false,

libraries/react/src/basic-tests.js

+10-8
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ import {
2929
ComponentWithUnregistered,
3030
ComponentWithImperativeEvent,
3131
ComponentWithDeclarativeEvent,
32-
ComponentWithMethods,
32+
ComponentWithoutProperties,
3333
} from "./components";
3434

3535
// Setup the test harness. This will get cleaned out with every test.
@@ -199,18 +199,20 @@ describe("basic support", function () {
199199
expect(data).to.eql("React");
200200
});
201201

202-
it('will not overwrite methods', function () {
203-
let root;
202+
it('will not overwrite unwriteable properties', function () {
203+
let wc;
204204
render(
205-
<ComponentWithMethods
205+
<ComponentWithoutProperties
206206
ref={(current) => {
207-
root = current;
207+
wc = current;
208208
}}
209209
/>
210210
)
211-
let wc = root.wc;
212-
expect(wc.innerText).to.eql('Success');
213-
})
211+
expect(wc.getAttribute('amethod')).to.eql('method');
212+
expect(wc.getAttribute('agetter')).to.eql('getter');
213+
expect(wc.getAttribute('areadonly')).to.eql('readonly');
214+
expect(wc.innerHTML).to.eql('Success');
215+
});
214216

215217
// TODO: Is it the framework's responsibility to check if the underlying
216218
// property is defined? Or should it just always assume it is and do its

libraries/react/src/components.js

+6-8
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import 'ce-without-children';
2020
import 'ce-with-children';
2121
import 'ce-with-properties';
2222
import 'ce-with-event';
23-
import 'ce-with-methods';
23+
import 'ce-without-properties';
2424

2525
export class ComponentWithoutChildren extends Component {
2626
render() {
@@ -111,13 +111,11 @@ export class ComponentWithProperties extends Component {
111111
}
112112
}
113113

114-
export class ComponentWithMethods extends Component {
115-
render() {
116-
return <div>
117-
<ce-with-methods test ref={(el) => this.wc = el}></ce-with-methods>
118-
</div>
119-
}
120-
}
114+
export const ComponentWithoutProperties = React.forwardRef(({}, ref) => {
115+
return <div>
116+
<ce-without-properties amethod="method" agetter="getter" areadonly="readonly" ref={ref}></ce-without-properties>
117+
</div>
118+
});
121119

122120
export class ComponentWithUnregistered extends Component {
123121
render () {

0 commit comments

Comments
 (0)