mediawiki-extensions-Revisi.../tests/selenium/pageobjects/diff.page.js
libraryupgrader f5de8ee108 build: Updating npm dependencies
* eslint-config-wikimedia: 0.27.0 → 0.28.0
  The following rules are failing and were disabled:
  * modules:
    * no-mixed-spaces-and-tabs
    * no-jquery/no-extend
    * implicit-arrow-linebreak
  * tests/qunit:
    * no-jquery/no-extend

* grunt-stylelint: 0.19.0 → 0.20.0
* stylelint-config-wikimedia: 0.16.1 → 0.17.1

Change-Id: I3fd3c4a2cbb03d3aa4c8efb658e33d14d24cd518
2024-06-08 12:04:26 +00:00

306 lines
7.3 KiB
JavaScript

'use strict';
const Page = require( 'wdio-mediawiki/Page' ),
Api = require( 'wdio-mediawiki/Api' ),
BlankPage = require( 'wdio-mediawiki/BlankPage' ),
Util = require( 'wdio-mediawiki/Util' ),
USER_BUBBLE_SELECTOR = '.mw-revslider-username-row .mw-revslider-bubble',
TAG_BUBBLE_SELECTOR = '.mw-revslider-tag-row:last-of-type .mw-revslider-bubble';
class DiffPage extends Page {
get rsMain() {
return $( '.mw-revslider-revision-slider' );
}
get rsToggleButton() {
return $( '.mw-revslider-toggle-button' );
}
get rsAutoExpandButton() {
return $( '.mw-revslider-auto-expand-button' );
}
get rsLoading() {
return $( '.mw-revslider-diff-loading' );
}
async waitUntilLoaded() {
await this.rsLoading.waitForDisplayed( { reverse: true } );
}
get rsEditOlderButton() {
return $( '#differences-prevlink' );
}
get rsEditNewerButton() {
return $( '#differences-nextlink' );
}
get rsPointerOlder() {
return $( '.mw-revslider-pointer-older' );
}
get rsPointerNewer() {
return $( '.mw-revslider-pointer-newer' );
}
async isOlderPointerOn( num ) {
return await this.rsPointerOlder.getAttribute( 'data-pos' ) === num.toString();
}
async isNewerPointerOn( num ) {
return await this.rsPointerNewer.getAttribute( 'data-pos' ) === num.toString();
}
get rsSummaryOlder() {
return $( '#mw-diff-otitle3' );
}
get rsSummaryNewer() {
return $( '#mw-diff-ntitle3' );
}
async showsOlderSummary( num ) {
const summary = await this.rsSummaryOlder.getText();
return await summary.includes( 'Summary ' + num );
}
async showsNewerSummary( num ) {
const summary = await this.rsSummaryNewer.getText();
return await summary.includes( 'Summary ' + num );
}
get rsUserFilterBubble() {
return $( USER_BUBBLE_SELECTOR );
}
get rsTagFilterBubble() {
return $( TAG_BUBBLE_SELECTOR );
}
getRevision( num ) {
return $( '.mw-revslider-revision[data-pos="' + num + '"]' );
}
getRevisionUp( num ) {
return $(
'//div[contains(@class,"mw-revslider-revision")][@data-pos="' + num + '"]' +
'/following-sibling::div[contains(@class,"revision-wrapper-up")]'
);
}
getRevisionDown( num ) {
return $(
'//div[contains(@class,"mw-revslider-revision")][@data-pos="' + num + '"]' +
'/following-sibling::div[contains(@class,"revision-wrapper-down")]'
);
}
getTooltip( num ) {
return $( '.mw-revslider-revision-tooltip-' + num );
}
get backwardsArrow() {
return $( '.mw-revslider-arrow-backwards' );
}
get forwardsArrow() {
return $( '.mw-revslider-arrow-forwards' );
}
async isBackwardsArrowDisabled() {
return await this.backwardsArrow.getAttribute( 'aria-disabled' ) === 'true';
}
async isForwardsArrowDisabled() {
return await this.forwardsArrow.getAttribute( 'aria-disabled' ) === 'true';
}
waitForSliding() {
this.waitForAnimation( $( '.mw-revslider-revisions-container' ) );
}
ready() {
Util.waitForModuleState( 'ext.RevisionSlider.lazyJs' );
}
/**
* @param {number} num Number of different edits.
* @param {boolean} [showHelp] Display help dialog. Defaults to false.
*/
async prepareSimpleTests( num, showHelp = false ) {
const title = Util.getTestString( 'revisionslider-test-' );
await BlankPage.open();
await this.toggleHelpDialog( showHelp );
await this.addUserEditsToPage( title, num );
this.open( title );
}
async prepareFilterTests() {
const title = await Util.getTestString( 'revisionslider-test-' );
await BlankPage.open();
await this.toggleHelpDialog( false );
await this.hasPageWithDifferentEdits( title );
await this.open( title );
}
async openSlider() {
await this.rsToggleButton.click();
try {
await this.rsMain.waitForDisplayed( { timeout: 2500 } );
} catch ( e ) {
await this.rsToggleButton.click();
await this.rsMain.waitForDisplayed();
}
}
open( title ) {
super.openTitle( title, { type: 'revision', diff: '' } );
}
get helpDialog() {
return $( '.mw-revslider-help-dialog' );
}
get nextHelpButton() {
return $( '.mw-revslider-help-next' );
}
/**
* @param {boolean} [show] Defaults to true.
*/
async toggleHelpDialog( show ) {
const hide = ( show === false ) ? '1' : '0';
await browser.execute( async function ( h ) {
await this.localStorage.setItem( 'mw-revslider-hide-help-dialogue', h );
}, hide );
}
async resetAutoExpand() {
await browser.execute( async function () {
await this.localStorage.setItem( 'mw-revslider-autoexpand', '0' );
} );
}
/**
* Will setup a test page with two user edits, one anonymous edit
* and a tagged.
*
* @param {string} title Article to edit.
*/
async hasPageWithDifferentEdits( title ) {
await this.addUserEditsToPage( title, 2 );
await this.addTaggedOtherUserEditToPage( title );
await this.addTaggedEditToPage( title );
}
/**
* @param {string} title Article to edit.
* @param {number} num Number of different edits to add.
*/
async addUserEditsToPage( title, num ) {
await browser.call( async () => {
const bot = await Api.bot();
for ( let i = 1; i <= num; i++ ) {
await bot.edit(
title,
'RevisionSlider-Test-Text ' + i,
'RevisionSlider-Test-Summary ' + i
);
}
} );
}
/**
* @param {string} title Article to edit.
*/
addTaggedEditToPage( title ) {
browser.call( async () => {
const bot = await Api.bot();
return bot.edit(
title,
'',
'RevisionSlider-Test-Tagged',
{ tags: 'mw-blank' }
);
} );
}
/**
* @param {string} title Article to edit.
*/
async addTaggedOtherUserEditToPage( title ) {
const otherUser = await Util.getTestString( 'User-' );
const otherUserPassword = await Util.getTestString();
await browser.call( async () => {
const bot = await Api.bot();
return await Api.createAccount( bot, otherUser, otherUserPassword );
} );
await browser.call( async () => {
const bot = await Api.bot( otherUser, otherUserPassword );
return bot.edit(
title,
'RevisionSlider-Test-Other-Text with tag',
'RevisionSlider-Test-Other-Tagged',
{ tags: 'mw-replace' }
);
} );
}
async dwellRevision( num ) {
await this.getRevision( num ).moveTo();
await this.getTooltip( num ).waitForDisplayed();
}
async dwellTagFilterBubble() {
await $( TAG_BUBBLE_SELECTOR ).moveTo();
}
async abondonBubbleDwell() {
// make sure we do not dwell the line/bubble after clicking
await $( '.mw-revslider-revision-tooltip p:first-of-type' ).moveTo();
}
async clickUserFilterBubble() {
await this.rsUserFilterBubble.click();
await this.abondonBubbleDwell();
}
async clickTagFilterBubble() {
await this.rsTagFilterBubble.click();
await this.abondonBubbleDwell();
}
async highlightsRevision( num ) {
const attr = await this.getRevision( num ).$( '..' ).getAttribute( 'class' );
return await attr.includes( 'mw-revslider-revision-filter-highlight' );
}
async highlightsBubble( el ) {
const element = await el.getAttribute( 'class' );
return await element.includes( 'mw-revslider-filter-highlight-bubble' );
}
async dragOlderPointerTo( num ) {
await this.rsPointerOlder.dragAndDrop( await this.getRevision( num ) );
}
async dragNewerPointerTo( num ) {
await this.rsPointerNewer.dragAndDrop( await this.getRevision( num ) );
}
waitForAnimation( el ) {
browser.execute( ( elem ) => {
setInterval( () => {
if ( $( elem ).filter( ':not(animated)' ) ) {
clearInterval();
}
}, 500 );
}, el );
}
}
module.exports = new DiffPage();