Page Menu
Home
WickedGov Phorge
Search
Configure Global Search
Log In
Files
F4095606
utils.test.js
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Flag For Later
Award Token
Size
4 KB
Referenced Files
None
Subscribers
None
utils.test.js
View Options
const
{
executeHCaptcha
,
loadHCaptcha
}
=
require
(
'ext.confirmEdit.hCaptcha/ext.confirmEdit.hCaptcha/utils.js'
);
QUnit
.
module
(
'ext.confirmEdit.hCaptcha.utils'
,
QUnit
.
newMwEnvironment
(
{
beforeEach
()
{
mw
.
config
.
set
(
'wgDBname'
,
'testwiki'
);
this
.
track
=
this
.
sandbox
.
stub
(
mw
,
'track'
);
this
.
logError
=
this
.
sandbox
.
stub
(
mw
.
errorLogger
,
'logError'
);
// Sinon fake timers as of v21 only return a static fake value from performance.measure(),
// so use a regular stub instead.
this
.
measure
=
this
.
sandbox
.
stub
(
performance
,
'measure'
);
this
.
measure
.
returns
(
{
duration
:
0
}
);
// We do not want to add real script elements to the page or interact with the real
// hcaptcha, so stub the code that does this for this test
this
.
window
=
{
hcaptcha
:
{
render
:
this
.
sandbox
.
stub
(),
execute
:
this
.
sandbox
.
stub
()
},
document
:
{
head
:
{
appendChild
:
this
.
sandbox
.
stub
()
}
}
};
},
afterEach
()
{
this
.
track
.
restore
();
this
.
measure
.
restore
();
this
.
logError
.
restore
();
}
}
)
);
QUnit
.
test
(
'should handle exception being thrown by hcaptcha.execute'
,
async
function
(
assert
)
{
this
.
window
.
hcaptcha
.
execute
.
throws
(
new
Error
(
'generic-failure'
)
);
this
.
measure
.
onFirstCall
().
returns
(
{
duration
:
2314
}
);
return
executeHCaptcha
(
this
.
window
,
'captcha-id'
,
'testinterface'
)
.
then
(
()
=>
{
// False positive
// eslint-disable-next-line no-jquery/no-done-fail
assert
.
fail
(
'Did not expect promise to fulfill'
);
}
)
.
catch
(
(
error
)
=>
{
assert
.
strictEqual
(
error
,
'generic-failure'
,
'should return error to caller'
);
assert
.
strictEqual
(
this
.
track
.
callCount
,
3
,
'should invoke mw.track() three times'
);
assert
.
deepEqual
(
this
.
track
.
getCall
(
0
).
args
,
[
'stats.mediawiki_confirmedit_hcaptcha_execute_total'
,
1
,
{
wiki
:
'testwiki'
,
interfaceName
:
'testinterface'
}
],
'should emit event for execution'
);
assert
.
deepEqual
(
this
.
track
.
getCall
(
1
).
args
,
[
'stats.mediawiki_confirmedit_hcaptcha_execute_workflow_error_total'
,
1
,
{
wiki
:
'testwiki'
,
interfaceName
:
'testinterface'
,
code
:
'generic_failure'
}
],
'should emit event for execution'
);
assert
.
deepEqual
(
this
.
track
.
getCall
(
2
).
args
,
[
'stats.mediawiki_confirmedit_hcaptcha_execute_duration_seconds'
,
2314
,
{
wiki
:
'testwiki'
,
interfaceName
:
'testinterface'
}
],
'should record metric for load time'
);
assert
.
strictEqual
(
this
.
logError
.
callCount
,
1
,
'should invoke mw.errorLogger.logError() once'
);
const
logErrorArguments
=
this
.
logError
.
getCall
(
0
).
args
;
assert
.
deepEqual
(
logErrorArguments
[
0
].
message
,
'generic-failure'
,
'should use correct channel for errors'
);
assert
.
deepEqual
(
logErrorArguments
[
1
],
'error.confirmedit'
,
'should use correct channel for errors'
);
}
);
}
);
QUnit
.
test
(
'loadHCaptcha should return early if previous hCaptcha SDK load succeeded'
,
async
function
(
assert
)
{
this
.
window
.
document
.
head
.
appendChild
.
callsFake
(
async
()
=>
{
this
.
window
.
onHCaptchaSDKLoaded
();
}
);
const
$qunitFixture
=
$
(
'#qunit-fixture'
);
const
script
=
document
.
createElement
(
'script'
);
script
.
className
=
'mw-confirmedit-hcaptcha-script mw-confirmedit-hcaptcha-script-loading-finished'
;
$qunitFixture
.
append
(
script
);
return
loadHCaptcha
(
this
.
window
,
'testinterface'
)
.
then
(
()
=>
{
assert
.
true
(
this
.
window
.
document
.
head
.
appendChild
.
notCalled
,
'should not load hCaptcha SDK'
);
assert
.
true
(
this
.
track
.
notCalled
,
'should not emit hCaptcha performance events'
);
}
)
.
catch
(
()
=>
{
// False positive
// eslint-disable-next-line no-jquery/no-done-fail
assert
.
fail
(
'Did not expect promise to reject'
);
}
);
}
);
QUnit
.
test
(
'loadHCaptcha should load hCaptcha SDK if previous attempt failed'
,
async
function
(
assert
)
{
this
.
window
.
document
.
head
.
appendChild
.
callsFake
(
async
()
=>
{
this
.
window
.
onHCaptchaSDKLoaded
();
}
);
const
$qunitFixture
=
$
(
'#qunit-fixture'
);
const
script
=
document
.
createElement
(
'script'
);
script
.
className
=
'mw-confirmedit-hcaptcha-script mw-confirmedit-hcaptcha-script-loading-failed'
;
$qunitFixture
.
append
(
script
);
assert
.
true
(
this
.
window
.
document
.
head
.
appendChild
.
notCalled
,
'should not have loaded hCaptcha SDK until call'
);
return
loadHCaptcha
(
this
.
window
,
'testinterface'
)
.
then
(
()
=>
{
assert
.
true
(
this
.
window
.
document
.
head
.
appendChild
.
calledOnce
,
'should load hCaptcha SDK'
);
}
)
.
catch
(
()
=>
{
// False positive
// eslint-disable-next-line no-jquery/no-done-fail
assert
.
fail
(
'Did not expect promise to reject'
);
}
);
}
);
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Tue, Aug 18, 13:57 (4 w, 7 h ago)
Storage Engine
local-disk
Storage Format
Raw Data
Storage Handle
6a/35/07a488fe6e83528fadff6251d50e
Default Alt Text
utils.test.js (4 KB)
Attached To
Mode
rMWPROD MediaWiki Production
Attached
Detach File
Event Timeline
Log In to Comment