First Commit
This commit is contained in:
432
tests/e2e/digital-download-plugin.spec.js
Normal file
432
tests/e2e/digital-download-plugin.spec.js
Normal file
@@ -0,0 +1,432 @@
|
||||
const { test, expect } = require('@playwright/test');
|
||||
|
||||
const SITE_URL = 'https://streamers.channel';
|
||||
const WP_ADMIN_USER = 'playwright';
|
||||
const WP_ADMIN_PASSWORD = '%Pzx*H1F(U79q6lQXsU)Ofxl';
|
||||
|
||||
// Configure test context to handle cookies and authentication
|
||||
test.use({
|
||||
// Accept cookies and set user agent
|
||||
userAgent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
|
||||
|
||||
// Set up context for cookie handling
|
||||
contextOptions: {
|
||||
acceptDownloads: true,
|
||||
// Enable JavaScript and cookies
|
||||
javaScriptEnabled: true,
|
||||
// Set up storage state for session persistence
|
||||
storageState: {
|
||||
cookies: [],
|
||||
origins: []
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// Helper function for WordPress admin login with cookie handling
|
||||
async function loginToWordPress(page) {
|
||||
// Clear any existing cookies first
|
||||
await page.context().clearCookies();
|
||||
|
||||
// Navigate to login page
|
||||
await page.goto(`${SITE_URL}/wp-login.php`, { waitUntil: 'networkidle' });
|
||||
|
||||
// Wait for login form to be available
|
||||
await page.waitForSelector('#loginform', { timeout: 10000 });
|
||||
|
||||
// Fill in credentials
|
||||
await page.fill('#user_login', WP_ADMIN_USER);
|
||||
await page.fill('#user_pass', WP_ADMIN_PASSWORD);
|
||||
|
||||
// Handle potential cookie/javascript issues
|
||||
await page.evaluate(() => {
|
||||
// Enable cookies if needed
|
||||
if (typeof Storage !== "undefined") {
|
||||
localStorage.setItem('wp-test', 'true');
|
||||
}
|
||||
});
|
||||
|
||||
// Submit form using JavaScript to avoid timeout issues
|
||||
await page.evaluate(() => {
|
||||
const form = document.getElementById('loginform');
|
||||
if (form) {
|
||||
form.submit();
|
||||
}
|
||||
});
|
||||
|
||||
// Wait for redirect to admin dashboard or handle login errors
|
||||
try {
|
||||
await page.waitForURL(/wp-admin/, { timeout: 15000 });
|
||||
return true;
|
||||
} catch (error) {
|
||||
// Check for login errors
|
||||
const errorMessage = await page.locator('#login_error').textContent().catch(() => null);
|
||||
if (errorMessage) {
|
||||
console.log(`Login error: ${errorMessage}`);
|
||||
}
|
||||
|
||||
// Alternative: Check if we're logged in by looking for admin bar
|
||||
const isLoggedIn = await page.locator('#wpadminbar').isVisible().catch(() => false);
|
||||
if (isLoggedIn) {
|
||||
return true;
|
||||
}
|
||||
|
||||
console.log('Login may have failed or timed out');
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
test.describe('WP Digital Download Plugin Tests', () => {
|
||||
test.describe('Shop Page', () => {
|
||||
test('should display shop page with products', async ({ page }) => {
|
||||
await page.goto(`${SITE_URL}/shop/`);
|
||||
|
||||
await expect(page).toHaveTitle(/Shop/);
|
||||
await expect(page.locator('h1')).toContainText('Shop');
|
||||
|
||||
await expect(page.locator('.wpdd-product-grid')).toBeVisible();
|
||||
await expect(page.locator('.wpdd-product')).toHaveCount(1);
|
||||
|
||||
const productTitle = page.locator('.wpdd-product h3');
|
||||
await expect(productTitle).toContainText('Test Product');
|
||||
|
||||
const productAuthor = page.locator('.wpdd-product-author');
|
||||
await expect(productAuthor).toContainText('shadowdao');
|
||||
|
||||
const productPrice = page.locator('.wpdd-product-price');
|
||||
await expect(productPrice).toContainText('Free');
|
||||
|
||||
await expect(page.locator('a:has-text("View Details")')).toBeVisible();
|
||||
await expect(page.locator('a:has-text("Free Download")')).toBeVisible();
|
||||
});
|
||||
|
||||
test('should have working search functionality', async ({ page }) => {
|
||||
await page.goto(`${SITE_URL}/shop/`);
|
||||
|
||||
const searchBox = page.locator('input[placeholder="Search products..."]');
|
||||
await expect(searchBox).toBeVisible();
|
||||
|
||||
// Test different search terms to identify the issue
|
||||
const searchTerms = ['Test', 'test', 'Test Product', 'Product', 'shadowdao'];
|
||||
|
||||
for (const term of searchTerms) {
|
||||
console.log(`Testing search term: "${term}"`);
|
||||
|
||||
await searchBox.fill(term);
|
||||
await page.keyboard.press('Enter');
|
||||
await page.waitForLoadState('networkidle');
|
||||
|
||||
// Check if products are found or no results message is shown
|
||||
const products = await page.locator('.wpdd-product h3').count();
|
||||
const noResults = await page.locator('text=No products found').count();
|
||||
|
||||
console.log(`Search "${term}": ${products} products found, ${noResults} no-result messages`);
|
||||
|
||||
if (products > 0) {
|
||||
await expect(page.locator('.wpdd-product h3')).toContainText('Test Product');
|
||||
break;
|
||||
} else if (noResults > 0) {
|
||||
console.log(`No products found for "${term}"`);
|
||||
}
|
||||
|
||||
// Reset for next search
|
||||
await page.goto(`${SITE_URL}/shop/`);
|
||||
}
|
||||
});
|
||||
|
||||
test('should have working sort functionality', async ({ page }) => {
|
||||
await page.goto(`${SITE_URL}/shop/`);
|
||||
|
||||
const sortSelect = page.locator('select').first();
|
||||
await expect(sortSelect).toBeVisible();
|
||||
|
||||
await sortSelect.selectOption('Newest first');
|
||||
await page.waitForLoadState('networkidle');
|
||||
|
||||
await sortSelect.selectOption('Price: Low to High');
|
||||
await page.waitForLoadState('networkidle');
|
||||
});
|
||||
});
|
||||
|
||||
test.describe('Product Detail Page', () => {
|
||||
test('should display product details correctly', async ({ page }) => {
|
||||
await page.goto(`${SITE_URL}/product/test-product/`);
|
||||
|
||||
await expect(page.locator('h1')).toContainText('Test Product');
|
||||
await expect(page.locator('.product-description')).toContainText('This is a test product');
|
||||
await expect(page.locator('.product-price')).toContainText('Free');
|
||||
|
||||
const downloadButton = page.locator('a:has-text("Free Download")');
|
||||
await expect(downloadButton).toBeVisible();
|
||||
});
|
||||
});
|
||||
|
||||
test.describe('Free Download Flow', () => {
|
||||
test('should complete free download without account', async ({ page }) => {
|
||||
await page.goto(`${SITE_URL}/shop/`);
|
||||
|
||||
await page.click('a:has-text("Free Download")');
|
||||
|
||||
await expect(page).toHaveURL(/checkout/);
|
||||
await expect(page.locator('h1')).toContainText('Checkout');
|
||||
await expect(page.locator('h3')).toContainText('Test Product');
|
||||
await expect(page.locator('.wpdd-checkout-price')).toContainText('Free');
|
||||
|
||||
const emailInput = page.locator('input[type="email"]');
|
||||
const nameInput = page.locator('input[placeholder*="Full Name"]');
|
||||
await emailInput.fill('test@example.com');
|
||||
await nameInput.fill('Test User');
|
||||
|
||||
const createAccountCheckbox = page.locator('input[type="checkbox"]:has-text("Create an account")');
|
||||
await expect(createAccountCheckbox).toBeVisible();
|
||||
await expect(createAccountCheckbox).not.toBeChecked();
|
||||
|
||||
await page.click('button:has-text("Get Free Download")');
|
||||
|
||||
await expect(page).toHaveURL(/thank-you/);
|
||||
await expect(page.locator('h2')).toContainText('Thank You for Your Purchase');
|
||||
|
||||
const orderNumber = page.locator('text=/WPDD-[A-Z0-9]+/');
|
||||
await expect(orderNumber).toBeVisible();
|
||||
|
||||
await expect(page.locator('text=Test Product')).toBeVisible();
|
||||
await expect(page.locator('text=$0.00')).toBeVisible();
|
||||
|
||||
const downloadLink = page.locator('a:has-text("Download Now")');
|
||||
await expect(downloadLink).toBeVisible();
|
||||
const downloadHref = await downloadLink.getAttribute('href');
|
||||
expect(downloadHref).toContain('wpdd_download');
|
||||
expect(downloadHref).toContain('_wpnonce');
|
||||
});
|
||||
|
||||
test('should complete free download with account creation', async ({ page }) => {
|
||||
const uniqueEmail = `test-${Date.now()}@example.com`;
|
||||
|
||||
await page.goto(`${SITE_URL}/shop/`);
|
||||
await page.click('a:has-text("Free Download")');
|
||||
|
||||
const emailInput = page.locator('input[type="email"]');
|
||||
const nameInput = page.locator('input[placeholder*="Full Name"]');
|
||||
await emailInput.fill(uniqueEmail);
|
||||
await nameInput.fill('Test User With Account');
|
||||
|
||||
const createAccountCheckbox = page.locator('input[type="checkbox"]');
|
||||
await createAccountCheckbox.check();
|
||||
await expect(createAccountCheckbox).toBeChecked();
|
||||
|
||||
await page.click('button:has-text("Get Free Download")');
|
||||
|
||||
await expect(page).toHaveURL(/thank-you/);
|
||||
await expect(page.locator('h2')).toContainText('Thank You');
|
||||
});
|
||||
});
|
||||
|
||||
test.describe('My Purchases Page', () => {
|
||||
test('should require login to view purchases', async ({ page }) => {
|
||||
await page.goto(`${SITE_URL}/my-purchases/`);
|
||||
|
||||
await expect(page.locator('h1')).toContainText('My Purchases');
|
||||
await expect(page.locator('text=Please login to view your purchases')).toBeVisible();
|
||||
|
||||
const loginLink = page.locator('a:has-text("login")');
|
||||
await expect(loginLink).toBeVisible();
|
||||
const href = await loginLink.getAttribute('href');
|
||||
expect(href).toContain('wp-login.php');
|
||||
expect(href).toContain('redirect_to');
|
||||
});
|
||||
|
||||
test('should show purchases after login', async ({ page }) => {
|
||||
const loginSuccessful = await loginToWordPress(page);
|
||||
|
||||
if (!loginSuccessful) {
|
||||
console.log('Skipping test - login failed');
|
||||
test.skip();
|
||||
return;
|
||||
}
|
||||
|
||||
await page.goto(`${SITE_URL}/my-purchases/`);
|
||||
|
||||
await expect(page.locator('h1')).toContainText('My Purchases');
|
||||
|
||||
const purchasesList = page.locator('.wpdd-purchases-list');
|
||||
if (await purchasesList.isVisible()) {
|
||||
await expect(purchasesList.locator('.wpdd-purchase-item')).toBeVisible();
|
||||
} else {
|
||||
await expect(page.locator('text=No purchases found')).toBeVisible();
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
test.describe('Admin Panel Integration', () => {
|
||||
test.beforeEach(async ({ page }) => {
|
||||
const loginSuccessful = await loginToWordPress(page);
|
||||
if (!loginSuccessful) {
|
||||
test.skip();
|
||||
}
|
||||
});
|
||||
|
||||
test('should have WP Digital Download menu in admin', async ({ page }) => {
|
||||
await page.goto(`${SITE_URL}/wp-admin/`);
|
||||
|
||||
const pluginMenu = page.locator('#adminmenu a:has-text("Digital Downloads")');
|
||||
await expect(pluginMenu).toBeVisible();
|
||||
|
||||
await pluginMenu.click();
|
||||
await expect(page).toHaveURL(/admin\.php\?page=wpdd/);
|
||||
});
|
||||
|
||||
test('should access products management', async ({ page }) => {
|
||||
await page.goto(`${SITE_URL}/wp-admin/admin.php?page=wpdd-products`);
|
||||
|
||||
await expect(page.locator('h1')).toContainText('Products');
|
||||
|
||||
const addNewButton = page.locator('a.page-title-action:has-text("Add New")');
|
||||
if (await addNewButton.isVisible()) {
|
||||
await expect(addNewButton).toBeVisible();
|
||||
}
|
||||
});
|
||||
|
||||
test('should access orders/purchases', async ({ page }) => {
|
||||
await page.goto(`${SITE_URL}/wp-admin/admin.php?page=wpdd-orders`);
|
||||
|
||||
await expect(page.locator('h1')).toContainText(/Orders|Purchases/);
|
||||
|
||||
const ordersTable = page.locator('.wp-list-table');
|
||||
if (await ordersTable.isVisible()) {
|
||||
await expect(ordersTable).toBeVisible();
|
||||
}
|
||||
});
|
||||
|
||||
test('should access plugin settings', async ({ page }) => {
|
||||
await page.goto(`${SITE_URL}/wp-admin/admin.php?page=wpdd-settings`);
|
||||
|
||||
await expect(page.locator('h1')).toContainText('Settings');
|
||||
|
||||
const settingsForm = page.locator('form#wpdd-settings-form');
|
||||
if (await settingsForm.isVisible()) {
|
||||
await expect(settingsForm).toBeVisible();
|
||||
|
||||
const saveButton = page.locator('input[type="submit"]');
|
||||
await expect(saveButton).toBeVisible();
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
test.describe('Responsive Design', () => {
|
||||
test('should be mobile responsive', async ({ page }) => {
|
||||
await page.setViewportSize({ width: 375, height: 667 });
|
||||
|
||||
await page.goto(`${SITE_URL}/shop/`);
|
||||
|
||||
await expect(page.locator('h1')).toBeVisible();
|
||||
await expect(page.locator('.wpdd-product')).toBeVisible();
|
||||
|
||||
const mobileMenu = page.locator('button.menu-toggle');
|
||||
if (await mobileMenu.isVisible()) {
|
||||
await mobileMenu.click();
|
||||
await expect(page.locator('nav.mobile-navigation')).toBeVisible();
|
||||
}
|
||||
});
|
||||
|
||||
test('should be tablet responsive', async ({ page }) => {
|
||||
await page.setViewportSize({ width: 768, height: 1024 });
|
||||
|
||||
await page.goto(`${SITE_URL}/shop/`);
|
||||
|
||||
await expect(page.locator('h1')).toBeVisible();
|
||||
await expect(page.locator('.wpdd-product-grid')).toBeVisible();
|
||||
});
|
||||
});
|
||||
|
||||
test.describe('Error Handling', () => {
|
||||
test('should handle invalid product URLs gracefully', async ({ page }) => {
|
||||
await page.goto(`${SITE_URL}/product/non-existent-product/`);
|
||||
|
||||
const notFoundMessage = page.locator('text=/not found|404|does not exist/i');
|
||||
await expect(notFoundMessage).toBeVisible();
|
||||
});
|
||||
|
||||
test('should validate checkout form', async ({ page }) => {
|
||||
await page.goto(`${SITE_URL}/shop/`);
|
||||
await page.click('a:has-text("Free Download")');
|
||||
|
||||
await page.click('button:has-text("Get Free Download")');
|
||||
|
||||
const emailError = page.locator('.wpdd-error-email');
|
||||
const nameError = page.locator('.wpdd-error-name');
|
||||
|
||||
if (await emailError.isVisible() || await nameError.isVisible()) {
|
||||
await expect(page.locator('.wpdd-error')).toBeVisible();
|
||||
}
|
||||
});
|
||||
|
||||
test('should handle empty cart/checkout', async ({ page }) => {
|
||||
await page.goto(`${SITE_URL}/checkout/`);
|
||||
|
||||
const emptyMessage = page.locator('text=/empty|no items|add products/i');
|
||||
if (await emptyMessage.isVisible()) {
|
||||
await expect(emptyMessage).toBeVisible();
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
test.describe('Security Tests', () => {
|
||||
test('should have CSRF protection on forms', async ({ page }) => {
|
||||
await page.goto(`${SITE_URL}/shop/`);
|
||||
|
||||
const downloadLink = await page.locator('a:has-text("Free Download")').getAttribute('href');
|
||||
expect(downloadLink).toContain('nonce=');
|
||||
});
|
||||
|
||||
test('should sanitize user inputs', async ({ page }) => {
|
||||
await page.goto(`${SITE_URL}/shop/`);
|
||||
await page.click('a:has-text("Free Download")');
|
||||
|
||||
const emailInput = page.locator('input[type="email"]');
|
||||
const nameInput = page.locator('input[placeholder*="Full Name"]');
|
||||
|
||||
await emailInput.fill('<script>alert("XSS")</script>@example.com');
|
||||
await nameInput.fill('<img src=x onerror=alert("XSS")>');
|
||||
|
||||
await page.click('button:has-text("Get Free Download")');
|
||||
|
||||
const alertDialog = page.locator('text=XSS');
|
||||
await expect(alertDialog).not.toBeVisible();
|
||||
});
|
||||
|
||||
test('should require authentication for admin pages', async ({ page }) => {
|
||||
const response = await page.goto(`${SITE_URL}/wp-admin/admin.php?page=wpdd-products`);
|
||||
|
||||
if (response.url().includes('wp-login.php')) {
|
||||
await expect(page).toHaveURL(/wp-login\.php/);
|
||||
} else {
|
||||
await expect(page.locator('#loginform')).toBeVisible();
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
test.describe('Performance Tests', () => {
|
||||
test('should load shop page within acceptable time', async ({ page }) => {
|
||||
const startTime = Date.now();
|
||||
await page.goto(`${SITE_URL}/shop/`);
|
||||
const loadTime = Date.now() - startTime;
|
||||
|
||||
expect(loadTime).toBeLessThan(5000);
|
||||
|
||||
await expect(page.locator('.wpdd-product')).toBeVisible();
|
||||
});
|
||||
|
||||
test('should handle pagination efficiently', async ({ page }) => {
|
||||
await page.goto(`${SITE_URL}/shop/`);
|
||||
|
||||
const pagination = page.locator('.wpdd-pagination');
|
||||
if (await pagination.isVisible()) {
|
||||
const nextButton = pagination.locator('a:has-text("Next")');
|
||||
if (await nextButton.isVisible()) {
|
||||
await nextButton.click();
|
||||
await expect(page).toHaveURL(/page=2|paged=2/);
|
||||
await expect(page.locator('.wpdd-product')).toBeVisible();
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
42
tests/e2e/wordpress-login.spec.js
Normal file
42
tests/e2e/wordpress-login.spec.js
Normal file
@@ -0,0 +1,42 @@
|
||||
const { test, expect } = require('@playwright/test');
|
||||
|
||||
const WP_ADMIN_USER = 'playwright';
|
||||
const WP_ADMIN_PASSWORD = '%Pzx*H1F(U79q6lQXsU)Ofxl';
|
||||
const SITE_URL = 'https://streamers.channel';
|
||||
|
||||
test.describe('WordPress Login', () => {
|
||||
test('should login to WordPress admin', async ({ page }) => {
|
||||
// Navigate to WordPress login page
|
||||
await page.goto(`${SITE_URL}/wp-login.php`);
|
||||
|
||||
// Fill in login credentials
|
||||
await page.fill('#user_login', WP_ADMIN_USER);
|
||||
await page.fill('#user_pass', WP_ADMIN_PASSWORD);
|
||||
|
||||
// Click login button
|
||||
await page.click('#wp-submit');
|
||||
|
||||
// Wait for dashboard to load
|
||||
await page.waitForURL(/wp-admin/);
|
||||
|
||||
// Verify we're logged in
|
||||
await expect(page).toHaveURL(/wp-admin/);
|
||||
await expect(page.locator('#wpadminbar')).toBeVisible();
|
||||
});
|
||||
|
||||
test('should access plugins page', async ({ page }) => {
|
||||
// First login
|
||||
await page.goto(`${SITE_URL}/wp-login.php`);
|
||||
await page.fill('#user_login', WP_ADMIN_USER);
|
||||
await page.fill('#user_pass', WP_ADMIN_PASSWORD);
|
||||
await page.click('#wp-submit');
|
||||
await page.waitForURL(/wp-admin/);
|
||||
|
||||
// Navigate to plugins page
|
||||
await page.goto(`${SITE_URL}/wp-admin/plugins.php`);
|
||||
|
||||
// Verify plugins page loaded
|
||||
await expect(page).toHaveURL(/plugins\.php/);
|
||||
await expect(page.locator('.wp-list-table.plugins')).toBeVisible();
|
||||
});
|
||||
});
|
Reference in New Issue
Block a user