Files
wp-digital-download/tests/e2e/digital-download-plugin.spec.js
2025-08-28 19:35:28 -07:00

432 lines
16 KiB
JavaScript

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();
}
}
});
});
});