Skip to content

Commit d5ec262

Browse files
authored
Merge pull request #483 from ProgressPlanner/filip/v15/tweak-e2e-tests
Tweak e2e tests
2 parents 816ac6d + a81ad4d commit d5ec262

9 files changed

Lines changed: 136 additions & 117 deletions

File tree

.github/workflows/playwright.yml

Lines changed: 53 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ env:
1111
WORDPRESS_DB_NAME: wordpress
1212
WORDPRESS_DB_PORT: 3307 # So it can run locally (hopefully).
1313
PRPL_TEST_TOKEN: 0220a2de67fc29094281088395939f58
14+
YOAST_TOKEN: ${{ secrets.YOAST_TOKEN }}
1415

1516
on:
1617
push:
@@ -77,46 +78,77 @@ jobs:
7778
-d "admin_email=$WORDPRESS_ADMIN_EMAIL" \
7879
-d "public=1"
7980
80-
# - name: Install necessary dependencies in WordPress container
81-
# run: |
82-
# docker exec $(docker ps -qf "name=wordpress") apt-get update
83-
# docker exec $(docker ps -qf "name=wordpress") apt-get install -y \
84-
# php php-cli php-mysql php-curl php-xml php-mbstring php-zip curl \
85-
# libnss3 libxss1 libasound2 libatk-bridge2.0-0 libgtk-3-0 libgbm-dev libwoff1
86-
8781
- name: Install and activate plugin
8882
run: |
83+
WP_CONTAINER=$(docker ps -qf "name=wordpress")
84+
8985
# Install WP-CLI
90-
docker exec $(docker ps -qf "name=wordpress") curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
91-
docker exec $(docker ps -qf "name=wordpress") chmod +x wp-cli.phar
92-
docker exec $(docker ps -qf "name=wordpress") mv wp-cli.phar /usr/local/bin/wp
86+
docker exec $WP_CONTAINER curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
87+
docker exec $WP_CONTAINER chmod +x wp-cli.phar
88+
docker exec $WP_CONTAINER mv wp-cli.phar /usr/local/bin/wp
9389
9490
# Create the plugins directory in the WordPress container
95-
docker exec $(docker ps -qf "name=wordpress") mkdir -p /var/www/html/wp-content/plugins
91+
docker exec $WP_CONTAINER mkdir -p /var/www/html/wp-content/plugins
9692
9793
# Copy plugin files to WordPress plugins directory
98-
docker cp . $(docker ps -qf "name=wordpress"):/var/www/html/wp-content/plugins/progress-planner
94+
docker cp . $WP_CONTAINER:/var/www/html/wp-content/plugins/progress-planner
9995
10096
# Activate the plugin using WP-CLI
101-
docker exec $(docker ps -qf "name=wordpress") wp plugin activate progress-planner --allow-root
97+
docker exec $WP_CONTAINER wp plugin activate progress-planner --allow-root
10298
10399
# Enable debug mode
104-
docker exec $(docker ps -qf "name=wordpress") wp option update prpl_debug true --allow-root
100+
docker exec $WP_CONTAINER wp option update prpl_debug true --allow-root
105101
106102
# Insert test token
107-
docker exec $(docker ps -qf "name=wordpress") wp option update progress_planner_test_token $PRPL_TEST_TOKEN --allow-root
103+
docker exec $WP_CONTAINER wp option update progress_planner_test_token $PRPL_TEST_TOKEN --allow-root
108104
109105
# Install Yoast SEO
110-
docker exec $(docker ps -qf "name=wordpress") wp plugin install wordpress-seo --activate --allow-root
111-
112-
# - name: Wait for WordPress to be ready
113-
# run: |
114-
# echo "Waiting for WordPress to be ready..."
115-
# sleep 30 # Adjust if necessary based on the container startup time
106+
docker exec $WP_CONTAINER wp plugin install wordpress-seo --activate --allow-root
116107
117108
- name: Run Playwright Tests
118109
run: npx playwright test tests/e2e/
119110

111+
# Begin Yoast SEO Premium tests
112+
- name: Install PHP & Composer on host
113+
run: |
114+
sudo apt-get update
115+
sudo apt-get install -y git curl unzip php-cli php-curl php-mbstring php-xml php-zip
116+
curl -sS https://getcomposer.org/installer | php
117+
sudo mv composer.phar /usr/local/bin/composer
118+
119+
- name: Install plugin dependencies (Composer)
120+
run: |
121+
composer config -g http-basic.my.yoast.com token $YOAST_TOKEN
122+
composer config repositories.my-yoast composer https://my.yoast.com/packages/
123+
composer config --no-plugins allow-plugins.composer/installers true
124+
composer install --working-dir=./
125+
126+
- name: Require Yoast SEO Premium & copy files
127+
run: |
128+
WP_CONTAINER=$(docker ps -qf "name=wordpress")
129+
composer require yoast/wordpress-seo-premium
130+
composer dump-autoload --working-dir=./wp-content/plugins/wordpress-seo-premium
131+
docker cp ./wp-content/plugins/wordpress-seo-premium $WP_CONTAINER:/var/www/html/wp-content/plugins/wordpress-seo-premium
132+
133+
- name: Activate Yoast SEO Premium
134+
run: |
135+
WP_CONTAINER=$(docker ps -qf "name=wordpress")
136+
docker exec $WP_CONTAINER wp plugin activate wordpress-seo-premium --allow-root
137+
138+
- name: Update Yoast Premium settings
139+
run: |
140+
WP_CONTAINER=$(docker ps -qf "name=wordpress")
141+
# Get current option value
142+
CURRENT_OPTION=$(docker exec $WP_CONTAINER wp option get wpseo_premium --format=json --allow-root)
143+
# Update the option with should_redirect_after_install set to false
144+
UPDATED_OPTION=$(echo $CURRENT_OPTION | jq '.should_redirect_after_install = false')
145+
# Save the updated option
146+
docker exec $WP_CONTAINER wp option update wpseo_premium "$UPDATED_OPTION" --format=json --allow-root
147+
148+
- name: Run Yoast Focus Element Test Again
149+
run: npx playwright test tests/e2e/yoast-focus-element.spec.js
150+
# End Yoast SEO Premium tests
151+
120152
- name: Upload Playwright Report
121153
if: always()
122154
uses: actions/upload-artifact@v4

playwright.config.js

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,7 @@ module.exports = defineConfig( {
2525
{
2626
name: 'parallel',
2727
use: { ...devices[ 'Desktop Chrome' ] },
28-
testIgnore: [
29-
'onboarding.spec.js',
30-
'task-tagline.spec.js',
31-
'todo.spec.js',
32-
'todo-reorder.spec.js',
33-
'todo-complete.spec.js',
34-
'sequential.spec.js',
35-
],
28+
testIgnore: [ 'sequential.spec.js', '**/sequential/**' ],
3629
fullyParallel: true,
3730
workers: 4,
3831
},

tests/e2e/constants/selectors.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
/**
2+
* Common selectors used across tests
3+
*/
4+
5+
const SELECTORS = {
6+
RR_ITEM_TEXT: 'h3 > label > span',
7+
TODO_ITEM: 'ul#todo-list > prpl-suggested-task li',
8+
TODO_COMPLETED_ITEM: 'ul#todo-list-completed > prpl-suggested-task li',
9+
TODO_LIST: 'ul#todo-list',
10+
TODO_LIST_COMPLETED: 'ul#todo-list-completed',
11+
};
12+
13+
module.exports = SELECTORS;

tests/e2e/sequential.spec.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
const { test } = require( '@playwright/test' );
2-
const onboardingTests = require( './onboarding.spec' );
3-
const taglineTests = require( './task-tagline.spec' );
4-
const todoTests = require( './todo.spec' );
5-
const todoReorderTests = require( './todo-reorder.spec' );
6-
const todoCompleteTests = require( './todo-complete.spec' );
2+
const onboardingTests = require( './sequential/onboarding.spec' );
3+
const taglineTests = require( './sequential/task-tagline.spec' );
4+
const todoTests = require( './sequential/todo.spec' );
5+
const todoReorderTests = require( './sequential/todo-reorder.spec' );
6+
const todoCompleteTests = require( './sequential/todo-complete.spec' );
77

88
test.describe( 'Sequential Tests', () => {
99
onboardingTests( test );
Lines changed: 25 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,28 @@ function onboardingTests( testContext = test ) {
2020
const form = page.locator( '#prpl-onboarding-form' );
2121
await expect( form ).toBeVisible();
2222

23+
// Submit button should be disabled
24+
const submitButtonWrapper = form.locator(
25+
'#prpl-onboarding-submit-wrapper'
26+
);
27+
2328
// Select "no" for email and accept privacy policy
2429
await form
2530
.locator( 'input[name="with-email"][value="no"]' )
2631
.click();
32+
33+
// Verify submit button is stilldisabled
34+
await expect( submitButtonWrapper ).toHaveClass(
35+
'prpl-disabled'
36+
);
37+
2738
await form.locator( 'input[name="privacy-policy"]' ).check();
2839

40+
// Accept privacy policy and verify button becomes enabled
41+
await expect( submitButtonWrapper ).not.toHaveClass(
42+
'prpl-disabled'
43+
);
44+
2945
// Submit the form
3046
await form
3147
.locator(
@@ -54,32 +70,17 @@ function onboardingTests( testContext = test ) {
5470
).toBeVisible( {
5571
timeout: 5000,
5672
} );
57-
}
58-
);
5973

60-
// testContext( 'should handle onboarding errors gracefully', async ( { page } ) => {
61-
// // Navigate to Progress Planner page
62-
// await page.goto( '/wp-admin/admin.php?page=progress-planner' );
63-
// await page.waitForLoadState( 'networkidle' );
64-
65-
// // Verify onboarding element is present
66-
// const onboardingElement = page.locator( '.prpl-welcome' );
67-
// await expect( onboardingElement ).toBeVisible();
68-
69-
// // Try to submit form without accepting privacy policy
70-
// const form = page.locator( '#prpl-onboarding-form' );
71-
// await form.locator( 'input[name="with-email"][value="no"]' ).click();
72-
73-
// // Submit button should be disabled
74-
// const submitButton = form.locator(
75-
// 'input[type="submit"].prpl-button-secondary--no-email'
76-
// );
77-
// await expect( submitButton ).toBeDisabled();
74+
// Visit the WP Dashboard page and back to the Progress Planner page.
75+
await page.goto( '/wp-admin/' );
76+
await page.goto( '/wp-admin/admin.php?page=progress-planner' );
77+
await page.waitForLoadState( 'networkidle' );
7878

79-
// // Accept privacy policy and verify button becomes enabled
80-
// await form.locator( 'input[name="privacy-policy"]' ).check();
81-
// await expect( submitButton ).toBeEnabled();
82-
// } );
79+
await expect(
80+
page.locator( '#prpl-onboarding-tasks' )
81+
).toHaveCount( 0 );
82+
}
83+
);
8384
} );
8485
}
8586

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
const { test, expect } = require( '@playwright/test' );
2-
const { makeAuthenticatedRequest } = require( './utils' );
2+
const { makeAuthenticatedRequest } = require( '../utils' );
33

44
function taglineTests( testContext = test ) {
55
testContext.describe( 'PRPL Complete Task', () => {

tests/e2e/todo-complete.spec.js renamed to tests/e2e/sequential/todo-complete.spec.js

Lines changed: 17 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
const { test, expect, chromium } = require( '@playwright/test' );
2+
const SELECTORS = require( '../constants/selectors' );
23

34
const TEST_TASK_TEXT = 'Task to be completed';
45

@@ -26,9 +27,7 @@ function todoCompleteTests( testContext = test ) {
2627
await page.waitForLoadState( 'networkidle' );
2728

2829
// Clean up active tasks
29-
const activeTodoItems = page.locator(
30-
'ul#todo-list > prpl-suggested-task li'
31-
);
30+
const activeTodoItems = page.locator( SELECTORS.TODO_ITEM );
3231

3332
while ( ( await activeTodoItems.count() ) > 0 ) {
3433
const firstItem = activeTodoItems.first();
@@ -49,7 +48,7 @@ function todoCompleteTests( testContext = test ) {
4948
await page.waitForTimeout( 500 );
5049

5150
const completedTodoItems = page.locator(
52-
'ul#todo-list-completed > prpl-suggested-task li'
51+
SELECTORS.TODO_COMPLETED_ITEM
5352
);
5453

5554
while ( ( await completedTodoItems.count() ) > 0 ) {
@@ -86,41 +85,34 @@ function todoCompleteTests( testContext = test ) {
8685
await page.waitForTimeout( 500 );
8786

8887
// Get the task selector
89-
const todoItem = page.locator(
90-
'ul#todo-list > prpl-suggested-task li'
91-
);
88+
const todoItem = page.locator( SELECTORS.TODO_ITEM );
9289
const taskId = await todoItem.getAttribute( 'data-task-id' );
9390
taskSelector = `li[data-task-id="${ taskId }"]`;
9491

95-
// Verify task was created
92+
// Complete the task
9693
const todoItemElement = page.locator(
97-
`ul#todo-list ${ taskSelector }`
94+
`${ SELECTORS.TODO_LIST } ${ taskSelector }`
9895
);
99-
await expect(
100-
todoItemElement.locator( 'h3 > label > span' )
101-
).toHaveText( TEST_TASK_TEXT );
102-
103-
// Click the checkbox to complete the task
10496
await todoItemElement
10597
.locator( '.prpl-suggested-task-checkbox' )
10698
.click();
10799
await page.waitForTimeout( 1000 );
108100

109-
// Verify task disappeared from active list
101+
// Verify task is not in active list
110102
await expect(
111-
page.locator( `ul#todo-list ${ taskSelector }` )
103+
page.locator( `${ SELECTORS.TODO_LIST } ${ taskSelector }` )
112104
).toHaveCount( 0 );
113105

114-
// Open completed tasks if not already open
106+
// Open completed tasks
115107
await page.locator( 'details#todo-list-completed-details' ).click();
116108

117-
// Verify task appears in completed list
109+
// Verify task is still in completed list with correct state
118110
const completedTask = page.locator(
119-
`ul#todo-list-completed ${ taskSelector }`
111+
`${ SELECTORS.TODO_LIST_COMPLETED } ${ taskSelector }`
120112
);
121113
await expect( completedTask ).toBeVisible();
122114
await expect(
123-
completedTask.locator( 'h3 > label > span' )
115+
completedTask.locator( SELECTORS.RR_ITEM_TEXT )
124116
).toHaveText( TEST_TASK_TEXT );
125117
await expect(
126118
completedTask.locator( '.prpl-suggested-task-checkbox' )
@@ -142,15 +134,13 @@ function todoCompleteTests( testContext = test ) {
142134
await page.waitForTimeout( 500 );
143135

144136
// Get the task selector
145-
const todoItem = page.locator(
146-
'ul#todo-list > prpl-suggested-task li'
147-
);
137+
const todoItem = page.locator( SELECTORS.TODO_ITEM );
148138
const taskId = await todoItem.getAttribute( 'data-task-id' );
149139
taskSelector = `li[data-task-id="${ taskId }"]`;
150140

151141
// Complete the task
152142
const todoItemElement = page.locator(
153-
`ul#todo-list ${ taskSelector }`
143+
`${ SELECTORS.TODO_LIST } ${ taskSelector }`
154144
);
155145
await todoItemElement
156146
.locator( '.prpl-suggested-task-checkbox' )
@@ -159,7 +149,7 @@ function todoCompleteTests( testContext = test ) {
159149

160150
// Verify task is not in active list
161151
await expect(
162-
page.locator( `ul#todo-list ${ taskSelector }` )
152+
page.locator( `${ SELECTORS.TODO_LIST } ${ taskSelector }` )
163153
).toHaveCount( 0 );
164154

165155
// Open completed tasks
@@ -169,11 +159,11 @@ function todoCompleteTests( testContext = test ) {
169159

170160
// Verify task is still in completed list with correct state
171161
const completedTask = page.locator(
172-
`ul#todo-list-completed ${ taskSelector }`
162+
`${ SELECTORS.TODO_LIST_COMPLETED } ${ taskSelector }`
173163
);
174164
await expect( completedTask ).toBeVisible();
175165
await expect(
176-
completedTask.locator( 'h3 > label > span' )
166+
completedTask.locator( SELECTORS.RR_ITEM_TEXT )
177167
).toHaveText( TEST_TASK_TEXT );
178168
await expect(
179169
completedTask.locator( '.prpl-suggested-task-checkbox' )

0 commit comments

Comments
 (0)