@@ -18,6 +18,13 @@ export const meta = {
18
18
} ;
19
19
20
20
export const create = ( context ) => {
21
+ function getReplacementObjectProperty ( styleName ) {
22
+ if ( styleName . type === "Literal" ) {
23
+ return camelCase ( styleName . value ) ;
24
+ }
25
+
26
+ return `[${ context . getSourceCode ( ) . getText ( styleName ) } ]` ;
27
+ }
21
28
function getReplacementStyleParam ( styleName , styleValue ) {
22
29
return styleName . type === "Literal"
23
30
? `{${ camelCase ( styleName . value ) } : ${ context
@@ -148,7 +155,7 @@ export const create = (context) => {
148
155
} ,
149
156
150
157
//expect(el.style["foo-bar"]).toBe("baz")
151
- [ `MemberExpression[property.name=style][parent.computed=true][parent.parent.parent.property.name=/toBe$|to(Strict)?Equal/][parent.parent.parent.parent.arguments.0.type=/(Template)?Literal/][parent.parent.callee.name=expect]` ] (
158
+ [ `MemberExpression[property.name=style][parent.computed=true][parent.parent.parent.property.name=/toBe$|to(Strict)?Equal/][parent.parent.parent.parent.arguments.0.type=/(( Template)?Literal|Identifier) /][parent.parent.callee.name=expect]` ] (
152
159
node
153
160
) {
154
161
const styleName = node . parent . property ;
@@ -157,10 +164,14 @@ export const create = (context) => {
157
164
const startOfStyleMemberExpression = node . object . range [ 1 ] ;
158
165
const endOfStyleMemberExpression =
159
166
node . parent . parent . arguments [ 0 ] . range [ 1 ] ;
160
- context . report ( {
161
- node : node . property ,
162
- message : "Use toHaveStyle instead of asserting on element style" ,
163
- fix ( fixer ) {
167
+
168
+ let fix = null ;
169
+
170
+ if (
171
+ typeof styleValue . value !== "number" &&
172
+ ! ( styleValue . value instanceof RegExp )
173
+ ) {
174
+ fix = ( fixer ) => {
164
175
return [
165
176
fixer . removeRange ( [
166
177
startOfStyleMemberExpression ,
@@ -169,10 +180,20 @@ export const create = (context) => {
169
180
fixer . replaceText ( matcher , "toHaveStyle" ) ,
170
181
fixer . replaceText (
171
182
styleValue ,
172
- getReplacementStyleParam ( styleName , styleValue )
183
+ typeof styleName . value === "number"
184
+ ? `{${ getReplacementObjectProperty (
185
+ styleValue
186
+ ) } : expect.anything()}`
187
+ : getReplacementStyleParam ( styleName , styleValue )
173
188
) ,
174
189
] ;
175
- } ,
190
+ } ;
191
+ }
192
+
193
+ context . report ( {
194
+ node : node . property ,
195
+ message : "Use toHaveStyle instead of asserting on element style" ,
196
+ fix,
176
197
} ) ;
177
198
} ,
178
199
//expect(el.style["foo-bar"]).not.toBe("baz")
@@ -185,10 +206,10 @@ export const create = (context) => {
185
206
const endOfStyleMemberExpression =
186
207
node . parent . parent . arguments [ 0 ] . range [ 1 ] ;
187
208
188
- context . report ( {
189
- node : node . property ,
190
- message : "Use toHaveStyle instead of asserting on element style" ,
191
- fix ( fixer ) {
209
+ let fix = null ;
210
+
211
+ if ( typeof styleName . value !== "number" ) {
212
+ fix = ( fixer ) => {
192
213
return [
193
214
fixer . removeRange ( [
194
215
node . object . range [ 1 ] ,
@@ -200,7 +221,13 @@ export const create = (context) => {
200
221
getReplacementStyleParam ( styleName , styleValue )
201
222
) ,
202
223
] ;
203
- } ,
224
+ } ;
225
+ }
226
+
227
+ context . report ( {
228
+ node : node . property ,
229
+ message : "Use toHaveStyle instead of asserting on element style" ,
230
+ fix,
204
231
} ) ;
205
232
} ,
206
233
//expect(foo.style).toHaveProperty("foo", "bar")
@@ -225,9 +252,9 @@ export const create = (context) => {
225
252
fixer . replaceText ( matcher , "toHaveStyle" ) ,
226
253
fixer . replaceTextRange (
227
254
[ styleName . range [ 0 ] , styleValue . range [ 1 ] ] ,
228
- `{${ camelCase (
229
- styleName . value
230
- ) } : ${ context . getSourceCode ( ) . getText ( styleValue ) } }`
255
+ `{${ camelCase ( styleName . value ) } : ${ context
256
+ . getSourceCode ( )
257
+ . getText ( styleValue ) } }`
231
258
) ,
232
259
] ;
233
260
} ,
@@ -238,10 +265,8 @@ export const create = (context) => {
238
265
[ `MemberExpression[property.name=style][parent.parent.property.name=not][parent.parent.parent.property.name=toHaveProperty][parent.callee.name=expect]` ] (
239
266
node
240
267
) {
241
- const [
242
- styleName ,
243
- styleValue ,
244
- ] = node . parent . parent . parent . parent . arguments ;
268
+ const [ styleName , styleValue ] =
269
+ node . parent . parent . parent . parent . arguments ;
245
270
const matcher = node . parent . parent . parent . property ;
246
271
247
272
context . report ( {
@@ -259,9 +284,9 @@ export const create = (context) => {
259
284
fixer . replaceText ( matcher , "toHaveStyle" ) ,
260
285
fixer . replaceTextRange (
261
286
[ styleName . range [ 0 ] , styleValue . range [ 1 ] ] ,
262
- `{${ camelCase (
263
- styleName . value
264
- ) } : ${ context . getSourceCode ( ) . getText ( styleValue ) } }`
287
+ `{${ camelCase ( styleName . value ) } : ${ context
288
+ . getSourceCode ( )
289
+ . getText ( styleValue ) } }`
265
290
) ,
266
291
] ;
267
292
} ,
0 commit comments