Page Menu
Home
WickedGov Phorge
Search
Configure Global Search
Log In
Files
F4139961
showIPButton.test.js
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Flag For Later
Award Token
Size
6 KB
Referenced Files
None
Subscribers
None
showIPButton.test.js
View Options
'use strict'
;
jest
.
mock
(
'../../../../modules/ext.checkUser.tempAccounts/icons.json'
,
()
=>
(
{
cdxIconInfo
:
''
}
),
{
virtual
:
true
}
);
const
{
config
,
mount
}
=
require
(
'@vue/test-utils'
);
const
mockPerformFullRevealRequest
=
jest
.
fn
();
const
getFormattedBlockDetails
=
jest
.
fn
();
global
.
mw
.
util
.
isTemporaryUser
=
jest
.
fn
().
mockImplementation
(
(
username
)
=>
String
(
username
).
startsWith
(
'~'
)
);
global
.
mw
.
language
.
listToText
=
jest
.
fn
().
mockImplementation
(
(
list
)
=>
list
.
join
(
', '
)
);
jest
.
mock
(
'../../../../modules/ext.checkUser.tempAccounts/rest.js'
,
()
=>
(
{
performFullRevealRequest
:
mockPerformFullRevealRequest
}
)
);
jest
.
mock
(
'../../../../modules/ext.checkUser.tempAccounts/api.js'
,
()
=>
(
{
getFormattedBlockDetails
}
)
);
const
ShowIPButton
=
require
(
'../../../../modules/ext.checkUser.tempAccounts/components/ShowIPButton.vue'
);
const
renderComponent
=
(
props
)
=>
mount
(
ShowIPButton
,
{
props
,
global
:
{
stubs
:
{
// Stub CdxPopover because it relies on the floating-ui library for positioning
// in a way that causes infinite recursion when mounted in JSDOM.
CdxPopover
:
true
}
}
}
);
config
.
global
.
renderStubDefaultSlot
=
true
;
describe
(
'ShowIPButton'
,
()
=>
{
const
configMap
=
new
Map
();
jest
.
spyOn
(
global
.
mw
.
config
,
'get'
)
.
mockImplementation
(
(
key
)
=>
configMap
.
get
(
key
)
);
beforeEach
(
()
=>
{
configMap
.
clear
();
configMap
.
set
(
'wgCheckUserIsPerformerBlocked'
,
false
);
configMap
.
set
(
'wgCUDMaxAge'
,
90
*
86400
);
// Use a well-known window name to have the component avoid passing an anchor to CdxPopover.
// CdxPopover needs to be shallow rendered for reasons outlined above, and vue-test-utils
// is unable to stringify references holding an HTML element.
global
.
window
.
name
=
'ShowIPButtonTests'
;
}
);
const
renderTestCases
=
{
'does not render when no target user is set'
:
[
null
,
false
],
'does not render for named users'
:
[
'TestUser'
,
false
],
'does not render for IP users'
:
[
'192.168.0.1'
,
false
],
'renders a button when given a valid temporary user'
:
[
'~2025'
,
true
]
};
for
(
const
[
testName
,
[
targetUser
,
shouldRender
]
]
of
Object
.
entries
(
renderTestCases
)
)
{
it
(
testName
,
()
=>
{
const
wrapper
=
renderComponent
(
{
targetUser
}
);
expect
(
wrapper
.
find
(
'.ext-checkuser-tempaccount-specialblock-ips-link'
).
exists
()
)
.
toStrictEqual
(
shouldRender
);
expect
(
wrapper
.
find
(
'.ext-checkuser-tempaccount-specialblock-block-details-toggle'
).
exists
()
)
.
toStrictEqual
(
false
);
expect
(
wrapper
.
find
(
'.ext-checkuser-tempaccount-specialblock-block-details'
).
exists
()
)
.
toStrictEqual
(
false
);
}
);
}
it
(
'renders a button and info icon if the performer is blocked when given a valid temporary user'
,
()
=>
{
configMap
.
set
(
'wgCheckUserIsPerformerBlocked'
,
true
);
const
wrapper
=
renderComponent
(
{
targetUser
:
'~2025'
}
);
expect
(
wrapper
.
find
(
'.ext-checkuser-tempaccount-specialblock-ips-link'
).
exists
()
)
.
toStrictEqual
(
true
);
expect
(
wrapper
.
find
(
'.ext-checkuser-tempaccount-specialblock-block-details-toggle'
).
exists
()
)
.
toStrictEqual
(
true
);
expect
(
wrapper
.
find
(
'.ext-checkuser-tempaccount-specialblock-block-details'
).
exists
()
)
.
toStrictEqual
(
true
);
}
);
const
blockInfoTestCases
=
{
'should show formatted block info'
:
[
{
query
:
{
checkuserformattedblockinfo
:
{
details
:
'<p>some HTML</p>'
}
}
},
'<p>some HTML</p>'
,
null
,
null
],
'should show success message if block info is missing'
:
[
{
query
:
{
checkuserformattedblockinfo
:
{
details
:
null
}
}
},
null
,
'success'
,
'(checkuser-tempaccount-reveal-blocked-missingblock)'
],
'should show error message if block info API call fails'
:
[
null
,
null
,
'error'
,
'(checkuser-tempaccount-reveal-blocked-error)'
]
};
for
(
const
[
testName
,
[
mockResponse
,
expectedHtml
,
messageType
,
messageText
]
]
of
Object
.
entries
(
blockInfoTestCases
)
)
{
it
(
testName
,
async
()
=>
{
configMap
.
set
(
'wgCheckUserIsPerformerBlocked'
,
true
);
const
wrapper
=
renderComponent
(
{
targetUser
:
'~2025'
}
);
getFormattedBlockDetails
.
mockImplementation
(
async
()
=>
{
// Delay returning the mock response to allow testing the loading state.
await
wrapper
.
vm
.
$nextTick
();
if
(
mockResponse
)
{
return
mockResponse
;
}
else
{
throw
new
Error
(
''
);
}
}
);
await
wrapper
.
find
(
'.ext-checkuser-tempaccount-specialblock-block-details-toggle'
).
trigger
(
'click'
);
expect
(
wrapper
.
find
(
'.ext-checkuser-tempaccount-specialblock-block-details-indicator-wrapper'
).
exists
()
)
.
toStrictEqual
(
true
);
await
wrapper
.
vm
.
$nextTick
();
expect
(
wrapper
.
find
(
'.ext-checkuser-tempaccount-specialblock-block-details-indicator-wrapper'
).
exists
()
)
.
toStrictEqual
(
false
);
if
(
expectedHtml
)
{
expect
(
wrapper
.
find
(
'.ext-checkuser-tempaccount-specialblock-block-details-content > p'
).
html
()
)
.
toStrictEqual
(
expectedHtml
);
}
else
{
expect
(
wrapper
.
find
(
'.ext-checkuser-tempaccount-specialblock-block-details-content'
).
exists
()
)
.
toStrictEqual
(
false
);
}
if
(
messageType
)
{
expect
(
wrapper
.
find
(
`.ext-checkuser-tempaccount-specialblock-block-details .cdx-message--
${
messageType
}
`
).
text
()
)
.
toStrictEqual
(
messageText
);
}
else
{
expect
(
wrapper
.
find
(
'.ext-checkuser-tempaccount-specialblock-block-details .cdx-message'
).
exists
()
)
.
toStrictEqual
(
false
);
}
}
);
}
const
revealTestCases
=
{
'should show checkuser-tempaccount-specialblock-ips for returned ips'
:
[
{
ips
:
[
'1.2.3.4'
,
'5.6.7.8'
]
},
'(checkuser-tempaccount-specialblock-ips, 2, 1.2.3.4, 5.6.7.8)'
],
'should show checkuser-tempaccount-no-ip-results when there are no results'
:
[
{
ips
:
[]
},
'(checkuser-tempaccount-no-ip-results, 90)'
],
'should show checkuser-tempaccount-reveal-ip-error for a failed request'
:
[
null
,
'(checkuser-tempaccount-reveal-ip-error)'
]
};
for
(
const
[
testName
,
[
mockResponse
,
expectedText
]
]
of
Object
.
entries
(
revealTestCases
)
)
{
it
(
testName
,
async
()
=>
{
if
(
mockResponse
)
{
mockPerformFullRevealRequest
.
mockResolvedValue
(
mockResponse
);
}
else
{
mockPerformFullRevealRequest
.
mockRejectedValue
(
{}
);
}
const
wrapper
=
renderComponent
(
{
targetUser
:
'~2025'
}
);
await
wrapper
.
find
(
'.ext-checkuser-tempaccount-specialblock-ips-link'
).
trigger
(
'click'
);
expect
(
mockPerformFullRevealRequest
).
toHaveBeenCalledWith
(
'~2025'
);
expect
(
wrapper
.
find
(
'.ext-checkuser-tempaccount-specialblock-ips'
).
text
()
)
.
toStrictEqual
(
expectedText
);
}
);
}
it
(
'should clear the message and show the button when the target changes'
,
async
()
=>
{
const
wrapper
=
renderComponent
(
{
targetUser
:
'~2025'
}
);
wrapper
.
vm
.
message
=
'foo'
;
await
wrapper
.
setProps
(
{
targetUser
:
'~2026'
}
);
expect
(
wrapper
.
vm
.
message
).
toStrictEqual
(
''
);
expect
(
wrapper
.
find
(
'.ext-checkuser-tempaccount-specialblock-ips-link'
).
exists
()
)
.
toStrictEqual
(
true
);
}
);
}
);
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Wed, Aug 19, 15:17 (3 w, 5 d ago)
Storage Engine
local-disk
Storage Format
Raw Data
Storage Handle
5a/55/fa55cb557f3403093e146444add0
Default Alt Text
showIPButton.test.js (6 KB)
Attached To
Mode
rMWPROD MediaWiki Production
Attached
Detach File
Event Timeline
Log In to Comment