-
Notifications
You must be signed in to change notification settings - Fork 23
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add functionality to reset page order #129
Changes from 6 commits
ad88c90
65b2d68
0ed6d42
6c03c86
3094a0b
f84e170
b3cf1c7
e33dec6
bd8a6fc
c2dc23d
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,43 @@ | ||
describe('Test Reset Page Order Change', () => { | ||
it('Can reset pages order', () => { | ||
cy.login(); | ||
cy.visit('/wp-admin/edit.php?post_type=page'); | ||
|
||
const first = '.wp-list-table tbody tr:nth-child(1)'; | ||
const second = '.wp-list-table tbody tr:nth-child(2)'; | ||
const firstText = cy.get(`${first} .row-title`); | ||
const secondText = cy.get(`${second} .row-title`); | ||
|
||
// first reorder the pages. | ||
cy.get(first).drag(second); | ||
// wait for order update done. | ||
cy.get(`${second} .check-column input`).should('exist'); | ||
|
||
cy.get(`${first} .row-title`).then($el => { | ||
secondText.should('have.text', $el.text()); | ||
}); | ||
cy.get(`${second} .row-title`).then($el => { | ||
firstText.should('have.text', $el.text()); | ||
}); | ||
|
||
// now reset the page order and verify original values are back. | ||
cy.get(`#contextual-help-link`).click(); | ||
cy.get(`#tab-link-simple_page_ordering_help_tab`).click(); | ||
cy.get(`#simple-page-ordering-reset`).click(); | ||
cy.on(`window:confirm`, () => true); | ||
|
||
// wait for the page to reload before checking for reset post order. | ||
cy.wait(1000); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Cypress considers using |
||
|
||
// Re-query row elements that were detached from the DOM during the page reload. | ||
const newFirstText = cy.get(`${first} .row-title`); | ||
const newSecondText = cy.get(`${second} .row-title`); | ||
|
||
cy.get(`${first} .row-title`).then($el => { | ||
newFirstText.should('have.text', $el.text()); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I think this will always be true, as There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. We need to save the original post names so that we can verify their positions after swapping and reverting. describe( 'Test Reset Page Order Change', () => {
it( 'Can reset pages order', () => {
cy.login();
cy.visit('/wp-admin/edit.php?post_type=page');
const firstRow = '.wp-list-table tbody tr:nth-child(1)';
const secondRow = '.wp-list-table tbody tr:nth-child(2)';
// Alias titles as `firstRowText` and `secondRowText` for convenience.
cy.get( firstRow ).find( '.row-title' ).invoke( 'text' ).as( 'firstRowText' );
cy.get( secondRow ).find( '.row-title' ).invoke( 'text' ).as( 'secondRowText' );
// Swap position of `Page 1` with `Page 2`.
cy.get( firstRow ).drag( secondRow );
// Verifies if 1st row has title `Page 2`.
cy.get( firstRow ).find( '.row-title' ).invoke( 'text' ).then( function( text ) {
expect( text ).to.eq( this.secondRowText );
} );
// Verifies if 2nd row has title `Page 1`.
cy.get( secondRow ).find( '.row-title' ).invoke( 'text' ).then( function( text ) {
expect( text ).to.eq( this.firstRowText );
} );
// Now reset the page order and verify original values are back.
cy.get( '#contextual-help-link' ).click();
cy.get( '#tab-link-simple_page_ordering_help_tab' ).click();
cy.get( '#simple-page-ordering-reset' ).click();
cy.on( 'window:confirm', () => true );
// Perform a reload as Cypress won't after window:confirm.
cy.reload();
// Verifies if 1st row has title `Page 1`.
cy.get( firstRow ).find( '.row-title' ).invoke( 'text' ).then( function( text ) {
expect( text ).to.eq( this.firstRowText );
} );
// Verifies if 2nd row has title `Page 2`.
cy.get( secondRow ).find( '.row-title' ).invoke( 'text' ).then( function( text ) {
expect( text ).to.eq( this.secondRowText );
} );
} );
} ); |
||
}); | ||
cy.get(`${second} .row-title`).then($el => { | ||
newSecondText.should('have.text', $el.text()); | ||
}); | ||
}); | ||
}); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@dkotter This PR works well. The only area that I am concerned about is the performance impact due to this line.
Would this be an issue for an extremely large database? If so, should we look into performing the updates in batches?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Looking at the code
wpdb::update
runs, seems like the final query will be something like:I think that should scale fairly well and we won't need to worry about doing any sort of batching here. That said, @ruscoe if you'd be able to do some quick testing on various sizes to see the performance impact, that would help us be more confident about merging this in. Something like profiling this code when run on a site that has 10 pages, 100 pages and 1000 pages, that would be helpful.
In addition, I think best practice here is to utilize the format properties of the
update
method. Something likeThere was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@dkotter No problem at all! I profiled by measuring execution time.
Just to show my process, first I used a quick shell script to create pages:
Then used the following to test:
Taking the average of five test runs each:
10 posts: 0.0041 microseconds
100 posts: 0.0042 microseconds
1000 posts: 0.0116 microseconds
5000 posts: 0.0299 microseconds
How does that look?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks @ruscoe! Definitely see an increase in time as the number of posts increase but the overall amount of time is so low that this doesn't seem like it will cause any problems. This looks good to go on my end